Sponsored Content
Full Discussion: Socket Keep-Alive
Top Forums Programming Socket Keep-Alive Post 302971952 by Corona688 on Wednesday 27th of April 2016 12:30:34 PM
Old 04-27-2016
All right, this loop is suspect:

Code:
    while ((size = recv(sock, recv_buf,
        RECV_BUFFER_SIZE, 0)) > 0)
    {
        recv_buf[size] = '\0';
        response.append(recv_buf);
    }

From man recv:

Code:
       When a stream socket peer has performed an orderly shutdown, the return
       value will be 0 (the traditional "end-of-file" return).

So, your program downloads the entire page, but doesn't stop there -- it calls recv() one more time when the transfer is done, which hangs until the web server becomes impatient and kicks you. Which is mecifully much less than the many minutes TCP usually defaults to. Then your program declares the download finished, writes another request to the dead socket, and "receives" another EOF in reply.

Reading until EOF might make sense without keepalives, but obviously won't do for persistent connections -- TCP/IP doesn't have an EOF signal, just an end of connection signal. This is why the web server must warn you of the content's length somehow -- as a content-length header, as chunked sections preprended with lengths in hexadecimal, etc.

Last edited by Corona688; 04-27-2016 at 01:47 PM..
This User Gave Thanks to Corona688 For This Post:
 

9 More Discussions You Might Find Interesting

1. 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

2. UNIX for Dummies Questions & Answers

Socket still alive!!

Hi, I'm investigate about a problem regarding a connection between two server (S1 and S2). A client software on S1 made a pool of connections on S2; for some reason some connections end but sockets still alive on S2 and not on S1. I always knew about sockets as a pair of processes; is it... (1 Reply)
Discussion started by: grado
1 Replies

3. Shell Programming and Scripting

Can we keep our script alive while logging out.

Hi I want to keep my script running even when i am logged off from the box. can we run the script in background which can automatically run every hour? Please advise. Thank you (1 Reply)
Discussion started by: Prateek007
1 Replies

4. UNIX for Advanced & Expert Users

connect problem for sctp socket (ipv6 socket) - Runtime fail Invalid Arguments

Hi, I was porting ipv4 application to ipv6; i was done with TCP transports. Now i am facing problem with SCTp transport at runtime. To test SCTP transport I am using following server and client socket programs. Server program runs fine, but client program fails giving Invalid Arguments for... (0 Replies)
Discussion started by: chandrutiptur
0 Replies

5. Programming

which socket should socket option on be set

Hi all, On the server side, one socket is used for listening, the others are used for communicating with the client. My question is: if i want to set option for socket, which socket should be set on? If either can be set, what's the different? Again, what's the different if set option... (1 Reply)
Discussion started by: blademan100
1 Replies

6. Programming

socket function to read a webpage (socket.h)

Why does this socket function only read the first 1440 chars of the stream. Why not the whole stream ? I checked it with gdm and valgrind and everything seems correct... #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include... (3 Replies)
Discussion started by: cyler
3 Replies

7. Programming

Error with socket operation on non-socket

Dear Experts, i am compiling my code in suse 4.1 which is compiling fine, but at runtime it is showing me for socket programming error no 88 as i searched in errno.h it is telling me socket operation on non socket, what is the meaning of this , how to deal with this error , please... (1 Reply)
Discussion started by: vin_pll
1 Replies

8. IP Networking

Clarification - Setting socket options at the same time when socket is listening

I need clarification on whether it is okay to set socket options on a listening socket simultaneously when it is being used in an accept() call? Following is the scenario:- -- Task 1 - is executing in a loop - polling a listen socket, lets call it 'fd', (whose file descriptor is global)... (2 Replies)
Discussion started by: jake24
2 Replies

9. What is on Your Mind?

Is this forum alive?

Odd thing. I posted in the Solaris forum, new user, just asking for a bit of advice. Nothing too complicated. As of this post there have been 140 views and zero replies. So that got me thinking, is this normal? I had a look around, and I see the same thing on many other threads, and in other... (2 Replies)
Discussion started by: _JonB_
2 Replies
socket(7)						 Miscellaneous Information Manual						 socket(7)

NAME
socket - interprocess communications DESCRIPTION
Sockets are communication endpoints that allow processes to communicate either locally or remotely. They are accessed by means of a set of system calls (see socket(2)). The following requests are defined in (see ioctl(2)): If the int with the address arg is non-zero, the socket is put into non-blocking mode. Otherwise, the socket is put into blocking mode. Blocking mode is the default. The request is equivalent to the request, although using is not recommended. See accept(2), connect(2), recv(2), and send(2) for an explanation of how non-blocking mode is used. For SOCK_STREAM sockets, the number of bytes currently readable from this socket is returned in the integer with the address arg. For SOCK_DGRAM sockets, the number of bytes currently readable, plus the size of the sockaddr structure (defined in is returned in the integer with the address arg. For SOCK_STREAM TCP sockets, on return the integer with the address arg is non-zero if the inbound TCP stream has been read up to where the out-of-band data byte starts. Otherwise, the inbound TCP stream has not yet been read up to where the out-of- band data byte starts. For sockets other than SOCK_STREAM TCP sockets, on return the integer with the address arg is always zero. This request sets the process group or process ID associated with the socket to be the value of the integer with the address arg. A process group or process ID associated with the socket in this manner is signaled when the state of the socket changes: is delivered upon the receipt of out-of- band data; is delivered if the socket is asynchronous, as described in below. If the value of the integer with the address arg is positive, the signal is sent to the process whose process ID matches the value specified. If the value is negative, the signal is sent to all the processes that have a process group equal to the absolute value of the value specified. If the value is zero, no signal is sent to any process. It is necessary to issue this request with a non-zero integer value to enable the signal delivery mechanism described above. The default for the process group or process ID value is zero. This request returns the process group or process ID associated with the socket in the integer with the address arg. See the explanation for above for more details on the meaning of the integer value returned. If the integer whose address is arg is non-zero, this request sets the state of the socket as asynchronous. Otherwise, the socket is put into synchronous mode (the default). Asynchronous mode enables the delivery of the signal when either of the following conditions is met. o New data arrives. o For connection-oriented protocols, whenever additional outgoing buffer space becomes available or the connection is established or broken. The process group or process ID associated with the socket must be non-zero in order for signals to be sent. The signal is delivered according to the semantics of described above. The fcntl(2) and flags (defined in are supported by sockets. If the flag is set, the socket is put into POSIX-style non-blocking mode. If the flag is set, the socket is put into non-blocking mode. Otherwise, the socket is put into blocking mode. Blocking mode is the default. See accept(2), connect(2), recv(2), and send(2) for an explanation of how these forms of non-blocking mode are used. Since the and flags and requests are supported, the following clarifies on how these features interact. If the or flag has been set, and requests behave accordingly, regardless of any requests. If neither the flag nor the flag has been set, requests control the the behavior of and DEPENDENCIES
AF_CCITT Only Only the and requests are defined for sockets. AUTHOR
was developed by the University of California, Berkeley. SEE ALSO
fcntl(2), getsockopt(2), ioctl(2), socket(2). socket(7)
All times are GMT -4. The time now is 06:18 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy