I've just started started socket programming so there's a few things I'm wondering about:

I found a set of socket programming codes here:
http://cs.baylor.edu/~donahoo/practical/CSockets/textcode.html

And the thing I don't really get is here in TCPEchoClient.c:

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 */
    }

Why did he use a while loop for this? Wouldn't you recieve the same data by just using

if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)
            DieWithError("recv() failed or connection closed prematurely");

In the project I'm doing, I don't really know how long the string I will be recieving is so can I/should I just write something like

if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)
            DieWithError("recv() failed or connection closed prematurely");

without the while loop?

EDIT: I tried it out and yeah, I recieved the same message with or without the while loop so my question still stands, why use a while loop?

But more importantly... the thing I'm having trouble with in my project is...

Okay, say I have a message to send like this:

char message[50] = "Not enough to be 50";
char *msg = message;

Will there be any problems if I send the message over like this:

send(int fd, msg, 50,int flags);

That is, can I send my message based on the length of the char array rather than the actual number of characters in the string?

The thing is, the length of my message differs depending on the situation. If it is an error message the length would be 51, if it is an acknowledgement message it would be length 10. Is there any way to send the message without using if clauses like:

if there's an error, send message of length 51
else send message of length 10

Also, if anyone needs to see the original TCPEchoClient.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 32   /* 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);
}

Edited 7 Years Ago by pocku: n/a

And the thing I don't really get is here in TCPEchoClient.c:

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 */
}

Why did he use a while loop for this? Wouldn't you recieve the same data by just using

if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)
        DieWithError("recv() failed or connection closed prematurely"); 

In the project I'm doing, I don't really know how long the string I will be recieving is....

To follow that with another question, if you remove the while statement, what happens if the amount of information you receive exceeds the buffer size? Even from the author's comments, it looks like it will successfully store up to the buffer size amount of bytes, but then, you would not read in the rest of the data. So I'm assuming that the reason for the while loop is to ensure that all of the data is read in - even if it exceeds the size of the buffer. But what do I know, I'm honestly surprised they even let me post in the C forum anymore.

Either way, good luck on your assignment. I have a similar project that I haven't started yet - setting up sockets in C with a client/server model is apparently somewhat difficult.

Edited 3 Years Ago by mike_2000_17: Fixed formatting

...So I'm assuming that the reason for the while loop is to ensure that all of the data is read in - even if it exceeds the size of the buffer. But what do I know, I'm honestly surprised they even let me post in the C forum anymore.


Either way, good luck on your assignment. I have a similar project that I haven't started yet - setting up sockets in C with a client/server model is apparently somewhat difficult.

Thanks! :) And yeah, I'm actually having quite a hard time getting this right....

Also, you're most likely right since I received a bunch of gibberish from time to time now without the while loop... so how am I going to receive data if I don't know the exact character length I will be receiving?

my tack is
i have to send some command to tcp/ip reader ,then i have to get resopnse,next i have to send one more command to tcp/ip,and i should get response,but iam not able to get response,
for the first send command iam able to get response,after send command,iam not able to get,without closing the socket,i have to send and receive,and send and receive,like that i have to do,so please help me

pleae give some fast response
thanks

This article has been dead for over six months. Start a new discussion instead.