Jonny Holmes
Jonny Holmes

Reputation: 163

TCP/IP in C not working

I am having trouble getting my TCP/IP connection between my client and server working.

Here is the server code -

int main() {
    int servSock; /* Socket descriptor for server */
    int clntSock; /* Socket descriptor for client */
    unsigned short echoServPort; /* Server port */
    struct sockaddr_in echoServAddr; /* Local address */
    struct sockaddr_in echoClntAddr; /* Local address */
    pid_t processID; /* Process ID from fork()*/
    unsigned int childProcCount = 0; /* Number of child processes */
    unsigned int clntLen;
    unsigned int recvMsgSize;

        echoServPort = 22;
        if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
            printf("Socket failed");
        }

        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

        if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){
            printf("bind failed");
        }

        if (listen(servSock, MAXPENDING) < 0){
            printf("listen() failed");
        }

        clntLen = sizeof(echoClntAddr);

        if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen))<0){
            printf("accept() failed");
        }

        if ((recvMsgSize = recv(clntSock, buf, 1024, 0)) < 0){
            printf("recv() failed");
        }

        /* Send received string and receive again until end of transmission */
        while (recvMsgSize > 0) { /* zero indicates end of transmission */


            printf("%d", recvMsgSize);

        if (send(clntSock, buf, recvMsgSize, 0) != recvMsgSize){
            //printf(“send() failed”);
        }

        if ((recvMsgSize = recv(clntSock, buf, 1024, 0)) < 0){
            //printf(“recv() failed”);
        }

        }

        sleep(60);

    }
}
return EXIT_SUCCESS;
}

And the client code, which is a CGI application.

int main(void) {

int servSock; /* Socket descriptor for server */
int clntSock; /* Socket descriptor for client */
unsigned short echoServPort; /* Server port */
struct sockaddr_in echoServAddr; /* Local address */
struct sockaddr_in echoClntAddr; /* Local address */

struct sockaddr_in {
        __uint8_t       sin_len;
        sa_family_t     sin_family;
        in_port_t       sin_port;
        struct  in_addr sin_addr;
        char            sin_zero[8];
};
/*pid_t processID;  Process ID from fork()
unsigned int childProcCount = 0;  Number of child processes
unsigned int clntLen;*/
//char echoservIP = "10.0.0.2";
printf("Content-type: text/html\n\n");
puts("<HTML>");
puts("<BODY>");
echoServPort = 22;
servSock = 22;
clntSock = 22;

puts("<br>");

if ((clntSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
    printf("socket() failed");
}

echoServAddr.sin_family = AF_INET;  //Internet address family
echoServAddr.sin_addr.s_addr = inet_addr("10.0.0.2");  //Server IP address
echoServAddr.sin_port = htons(echoServPort);  //Server port

echoClntAddr.sin_addr.s_addr = inet_addr("10.0.0.1");


if (connect(clntSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){
    printf("connect() failed\n");

}

int clntLen;

clntLen = sizeof(echoClntAddr);

if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen))<0){
    printf("accept() failed\n");
}

char echoString[4] = "helo";

int echoStringLen;

echoStringLen = strlen(echoString);  //Determine input length
 //Send the string to the server
if (send(clntSock, echoString, echoStringLen, 0) != echoStringLen){
    printf("send() sent a different number of bytes than expected");
}

puts("<p>Hello <b>CGI</b</p>");
puts("</BODY>");
puts("</HTML>");


return EXIT_SUCCESS;
}

When debugging, the problem occurs on the client side at the line

if ((clntSock=accept(servSock,(struct sockaddr  
  *)&echoClntAddr,&clntLen))<0){
    printf("accept() failed\n");
 }

And at

if(send(clntSock, echoString, echoStringLen, 0) != echoStringLen){
    printf("send() sent a different number of bytes than expected");
}

I get the output

<HTML>
<BODY>
<br>
accept() failed
send() sent a different number of bytes than expected<p>Hello      
<b>CGI</b</p>

Need help fixing this!, thanks.

Upvotes: 1

Views: 276

Answers (2)

Prabhu
Prabhu

Reputation: 3541

If accept fails you shouldn't be proceeding with other operations on socket like recv. TCP connections is not in place for you to proceed in data exchange between server and client. You need to handle error conditions with out fail.

On the client side you have a custom error message on send. That does not help. Usually, partial sends are not common. Hence your print `sent a different number of bytes than expected' can be misleading. You need to find the real reason.

Calling accept in client code is not needed. Its the server which accepts and clients the ones which connect

Use errno and perror like - perror("Accept Failed") on ALL of your system calls for easier debugging and remove custom prints

Upvotes: 0

Andrew Henle
Andrew Henle

Reputation: 1

You don't need to call accept() on the client - you just need to connect.

And

char echoString[4] = "helo";

is wrong. It's not NUL-terminated. Just do

char echoString[] = "helo";

Upvotes: 2

Related Questions