Sponsored Content
Full Discussion: C - HTTP Socket Programming
Top Forums Programming C - HTTP Socket Programming Post 302305031 by kev_1234 on Tuesday 7th of April 2009 08:14:37 PM
Old 04-07-2009
C - HTTP Socket Programming

Hello everybody,

I learning socket programming in C and was wondering if anybody here could help me out.

I have two .c programs namely server.c and client.c .......

The client sends a message and the server in turn returns the value.

Basically I want to send in a request to a webserver say at port 80 in form of
Quote:
GET \DATA.HTML HTTP/1.1\r\n
and in return get value dumped back.

Here are the codes for Server.c and Client.c

Server.c
Code:
#include <stdio.h>      /* for printf() and fprintf() */ 
#include <sys/socket.h> /* for socket(), bind(), and connect() */ 
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */ 
#include <stdlib.h>     /* for atoi() and exit() */ 
#include <string.h>     /* for memset() */ 
#include <unistd.h>     /* for close() */ 
 
#define RCVBUFSIZE 64   /* Size of receive buffer */ 
#define MAXPENDING 5    /* Maximum outstanding connection requests */ 
 
void DieWithError(char *errorMessage);  /* Error handling function */ 
void HandleTCPClient(int clntSocket);   /* TCP client handling function */ 
 
int main(int argc, char *argv[]) 
{ 
    int servSock;                    /* Socket descriptor for server */ 
    int clntSock;                    /* Socket descriptor for client */ 
    struct sockaddr_in echoServAddr; /* Local address */ 
    struct sockaddr_in echoClntAddr; /* Client address */ 
    unsigned short echoServPort;     /* Server port */ 
    unsigned int clntLen;            /* Length of client address data structure */ 
 
    if (argc != 2)     /* Test for correct number of arguments */ 
    { 
        fprintf(stderr, "Usage:  %s <Server Port>\n", argv[0]); 
        exit(1); 
    } 
 
    echoServPort = atoi(argv[1]);  /* First arg:  local port */ 
 
    /* Create socket for incoming connections */ 
    if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 
        DieWithError("socket() failed"); 
       
    /* Construct local address structure */ 
    memset(&echoServAddr, 0, sizeof(echoServAddr));   /* Zero out structure */ 
    echoServAddr.sin_family = AF_INET;                /* Internet address family */ 
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ 
    echoServAddr.sin_port = htons(echoServPort);      /* Local port */ 
 
    /* Bind to the local address */ 
    if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) 
        DieWithError("bind() failed"); 
 
    /* Mark the socket so it will listen for incoming connections */ 
    if (listen(servSock, MAXPENDING) < 0) 
        DieWithError("listen() failed"); 
 
    for (;;) /* Run forever */ 
    { 
        /* Set the size of the in-out parameter */ 
        clntLen = sizeof(echoClntAddr); 
 
        /* Wait for a client to connect */ 
        if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr,  
                               &clntLen)) < 0) 
            DieWithError("accept() failed"); 
 
        /* clntSock is connected to a client! */ 
 
        printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr)); 
 
        HandleTCPClient(clntSock); 
    } 
    /* NOT REACHED */ 
}//-- end main --// 
 
 
 
// 
//// 
// 
void DieWithError(char *errorMessage) 
{ 
    perror(errorMessage); 
    exit(1); 
} 
 
 
 
// 
//// 
// 
void HandleTCPClient(int clntSocket) 
{ 
    char echoBuffer[RCVBUFSIZE];        /* Buffer for echo string */ 
    int recvMsgSize;                    /* Size of received message */ 
 
    /* Receive message from client */ 
    if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) 
        DieWithError("recv() failed"); 
 
    /* got incoming request from client in the echobuffer */ 
    recvMsgSize = sprintf(echoBuffer, 
                          "MOTOR=0,TEMPS are 3A,42,FA,99");//reply!  
 
    /* Send received string and receive again until end of transmission */ 
    while (recvMsgSize > 0)      /* zero indicates end of transmission */ 
    { 
        /* Echo message back to client */ 
        if (send(clntSocket, echoBuffer, recvMsgSize, 0) != recvMsgSize) 
            DieWithError("send() failed"); 
 
        /* See if there is more data to receive */ 
        if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) 
            DieWithError("recv() failed"); 
    } 
 
    close(clntSocket);    /* Close client socket */ 
}

Client.c
Code:
#include <stdio.h>      /* for printf() and fprintf() */ 
#include <sys/socket.h> /* for socket(), connect(), send(), and recv() */ 
#include <arpa/inet.h>  /* for sockaddr_in and inet_addr() */ 
#include <stdlib.h>     /* for atoi() and exit() */ 
#include <string.h>     /* for memset() */ 
#include <unistd.h>     /* for close() */ 
 
#define RCVBUFSIZE 64   /* Size of receive buffer */ 
 
void DieWithError(char *errorMessage);  /* Error handling function */ 
 
int main(int argc, char *argv[]) 
{ 
    int sock;                        /* Socket descriptor */ 
    struct sockaddr_in echoServAddr; /* Echo server address */ 
    unsigned short echoServPort;     /* Echo server port */ 
    char *servIP;                    /* Server IP address (dotted quad) */ 
    char *echoString;                /* String to send to echo server */ 
    char echoBuffer[RCVBUFSIZE];     /* Buffer for echo string */ 
    unsigned int echoStringLen;      /* Length of string to echo */ 
    int bytesRcvd, totalBytesRcvd;   /* Bytes read in single recv()  
                                        and total bytes read */ 
 
    if ((argc < 3) || (argc > 4))    /* Test for correct number of arguments */ 
    { 
       fprintf(stderr, "Usage: %s <Server IP> <Echo Word> [<Echo Port>]\n", 
               argv[0]); 
       exit(1); 
    } 
 
    servIP = argv[1];             /* First arg: server IP address (dotted quad) */ 
    echoString = argv[2];         /* Second arg: string to echo */ 
 
    if (argc == 4) 
        echoServPort = atoi(argv[3]); /* Use given port, if any */ 
    else 
        echoServPort = 7;  /* 7 is the well-known port for the echo service */ 
 
    /* Create a reliable, stream socket using TCP */ 
    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 
        DieWithError("socket() failed"); 
 
    /* Construct the server address structure */ 
    memset(&echoServAddr, 0, sizeof(echoServAddr));     /* Zero out structure */ 
    echoServAddr.sin_family      = AF_INET;             /* Internet address family */ 
    echoServAddr.sin_addr.s_addr = inet_addr(servIP);   /* Server IP address */ 
    echoServAddr.sin_port        = htons(echoServPort); /* Server port */ 
 
    /* Establish the connection to the echo server */ 
    if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) 
        DieWithError("connect() failed"); 
 
    echoStringLen = strlen(echoString);          /* Determine input length */ 
 
    /* Send the string to the server */ 
    if (send(sock, echoString, echoStringLen, 0) != echoStringLen) 
        DieWithError("send() sent a different number of bytes than expected"); 
 
    /* Receive the same string back from the server */ 
    totalBytesRcvd = 0; 
    printf("Received: ");                /* Setup to print the echoed string */ 
    while (totalBytesRcvd < echoStringLen) 
    { 
        /* Receive up to the buffer size (minus 1 to leave space for 
           a null terminator) bytes from the sender */ 
        if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0) 
            DieWithError("recv() failed or connection closed prematurely"); 
        totalBytesRcvd += bytesRcvd;   /* Keep tally of total bytes */ 
        echoBuffer[bytesRcvd] = '\0';  /* Terminate the string! */ 
        printf("%s", echoBuffer);      /* Print the echo buffer */ 
    } 
 
    printf("\n");    /* Print a final linefeed */ 
 
    close(sock); 
    exit(0); 
}//-- end main --// 
 
 
 
// 
//// 
// 
void DieWithError(char *errorMessage) 
{ 
    perror(errorMessage); 
    exit(1); 
}

Please advice as how I could achieve this.Smilie
Any sort of example will be great!

Last edited by kev_1234; 04-07-2009 at 09:22 PM..
 

10 More Discussions You Might Find Interesting

1. Programming

Socket Programming

Dear Reader, Is there any way to check up socket status other than 'netstatus ' Thanks in advance, (1 Reply)
Discussion started by: joseph_shibu
1 Replies

2. Programming

Socket Programming socket

Hello, I actually try to make client-server program. I'm using SCO OpenServer Release 5.0.0 and when I try to compile my code (by TELNET) I've got this error : I'm just using this simple code : and I get the same error if I use : If someone can help me, Thanks (2 Replies)
Discussion started by: soshell
2 Replies

3. IP Networking

socket programming

my system is a stand alone system... i want to try doing socket porgramming..ihave heard that this is usually done during testing... how can i do that....? (6 Replies)
Discussion started by: damn_bkb
6 Replies

4. Programming

Socket programming

Hello!:) I'm trying to do some socket programming based on the following situation: I have a directory service named Casino that will hold all the information regarding the gamers that will try to connect to it in order to play a game(for example (Blackjack).Once they make the login they are... (4 Replies)
Discussion started by: maracumbigo
4 Replies

5. Programming

HTTP Keep-Alive socket problem

Hello everyone, I am a newbie in UNIX/Linux socket programming. This is a class project that I had trouble with. ================================================== I was trying to make “Keep-Alive” HTTP connections to the server in a tiny web crawler project. Here is the problem: when I tried... (0 Replies)
Discussion started by: imdupeng
0 Replies

6. IP Networking

socket programming

Hello Everyone Iam working on tcp/ip programming.with some time interval server has to send data.client has to close the connection and to open the connection between the time interval.this is the scenario when iam closing the connection in client side the connection terminates.how to... (1 Reply)
Discussion started by: sureshvaikuntam
1 Replies

7. Programming

unable to get end of file while reading HTTP data from socket

I am trying to read HTTP data from a socket. However, for the final set of data being read using read(), read blocks and the control doesnt come back for further processing. I tried using select, but it didn't work... Any help would be greatly acknowledged.:) (2 Replies)
Discussion started by: Harish.joshi
2 Replies

8. Programming

sending http url through http socket programming..

hi am senthil am developing a software to send and receive SMS using HTTP connection first of all am forming a URL and sending that URL to a remote server using my Client Program i send that url through Socket(using Send() Function) if i send more than one URL one by one using the same... (0 Replies)
Discussion started by: senkerth
0 Replies

9. Shell Programming and Scripting

sending http url through http socket programming..

hi am senthil am developing a software to send and receive SMS using HTTP connection first of all am forming a URL and sending that URL to a remote server using my Client Program i send that url through Socket(using Send() Function) if i send more than one URL one by one using the same... (4 Replies)
Discussion started by: senkerth
4 Replies

10. Programming

socket programming

how to include socket.h in visual studio 2005.. (2 Replies)
Discussion started by: asd123
2 Replies
All times are GMT -4. The time now is 01:07 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy