LinuxQuestions.org
Visit Jeremy's Blog.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Newbie
User Name
Password
Linux - Newbie This Linux forum is for members that are new to Linux.
Just starting out and have a question? If it is not in the man pages or the how-to's this is the place!

Notices


Reply
  Search this Thread
Old 09-17-2012, 01:44 AM   #1
gajananh999
Member
 
Registered: Aug 2012
Posts: 94

Rep: Reputation: Disabled
Smile read(newsockfd, buffer ,to read) sometimes getting struck


Hello Everyone,

I have written socket programming in c++.
some times my read will get strucked.

Code:

void handlesocket(int newsockfd)
{
        char *buffer, *temp, *temp2;
        int n,i;
        int readNow, toRead;
        if (newsockfd < 0)
                error("ERROR on accept");

        buffer = new char[960000];
        temp = new char[16];
        temp[0] = '\0';
        temp2 = new char[1];
        temp2[0] = '\0';
        i = 0;
        do
        {
                n = read(newsockfd,temp2, 1);
                if(temp2[0]=='@') break;
                temp[i++] = temp2[0];
                temp[i] = '\0';
        }
        while(n > 0);

        n = 0;
        do
        {
                buffer[0] = '\0';
                toRead = atoi(temp) - n;
          printf("ready to read\n ToRead=%d\n",toRead);
          //Sometime strucking at this next line
             readNow = read(newsockfd,buffer,toRead);
                printf("ReadNow is %d\n",readNow);
                if(readNow < 0) break;
                n += readNow;
                printf("ISAC %d --- %d --- %d\n",atoi(temp),n,readNow);
                buffer[readNow] = '\0';
                writeintofile(buffer);
        }
        while(n < atoi(temp));
  close(newsockfd);
        free(buffer);
        free(temp);
        free(temp2);
}

Please help me out...
 
Old 09-17-2012, 10:51 AM   #2
ninis666
LQ Newbie
 
Registered: Aug 2011
Posts: 5

Rep: Reputation: Disabled
check your lenght ... and read return values

1/ You dont check if the lenght is correct (you're expecting to read more than what you'll have to).
2/ You have to test the return value of read system call (take a look into the manpage).

By the way, dont you have to allocate memory for your temporary variables (except for your read buffer, it can't fit in stack in some systems). I think that you should use something like this :


Code:
void handlesocket(int newsockfd)
{
#define MAX 960000
    int i, n, lenght, done;
    char temp2;
    char * buffer;
    char temp[16];

    if (newsockfd < 0) {
	fprintf(stderr, "Failed to read lenght from socket : %m\n");
	return;
    }

    i = 0;
    while (1) {
	n = read(newsockfd, &temp2, 1);
	if (n < 0) {
	    if (errno != EAGAIN && errno != EWOULDBLOCK) {
		fprintf(stderr, "Failed to read lenght from socket : %m\n");
		return;
	    }

	    n = 0;
	}

	if (temp2 == '@')
	    break;

        if (i >= sizeof temp) {
            fprintf(stderr, "Toooo long lenght received (max = %d, %d received so far)\n", sizeof temp, i);
            return;
        }

	temp[i++] = temp2;
	temp[i] = '\0';
    }

    lenght = atoi(temp);
    if (lenght <= 0 || lenght >= MAX) {
	fprintf(stderr, "Invalid lenght received : %s\n", temp);
	return;
    }

    buffer = new char [lenght + 1];
    if (buffer == NULL) {
	fprintf(stderr, "Cannot create buffer of %db\n", lenght + 1);
	return;
    }

    printf("Reading %d bytes\n", lenght);

    do {

	n = read(newsockfd, buffer + done, lenght - done);
	if (n < 0) {
	    if (errno != EAGAIN && errno != EWOULDBLOCK) {
		fprintf(stderr, "Failed to read data from socket : %m\n");
		return;
	    }
	    n = 0;
	}

	done += n;

    } while (done < lenght);

    buffer[lenght] = 0;
    writeintofile(buffer);
    close(newsockfd);
    delete buffer;
}
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
how to read from the stderr and stdout buffer? omega341991 Linux - Newbie 1 06-08-2012 03:54 AM
How to read buffer in C? obladioblada Programming 19 02-05-2009 05:24 PM
buffer i/o read error from hdd fakie_flip Linux - Software 4 08-20-2006 11:26 PM
read from tty buffer vineeth789 Programming 1 01-12-2006 10:40 AM
tcp/ip read and write buffer da_kidd_er Linux - Software 0 11-21-2004 04:13 PM

LinuxQuestions.org > Forums > Linux Forums > Linux - Newbie

All times are GMT -5. The time now is 09:41 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration