Send ()functions are used by defaultNaglealgorithm. NagleThe algorithm passes unacknowledged data into a buffer until it accumulates to a certain number of methods that are sent together. To reduce the number of fragmented small packets that the host sends. So supposeSend ()when the function sends the data too fast, the algorithm will send some data together and send it out uniformly. Assuming this is not the case, the receiving end will encounter seemingly strange problems, such as successRecv ()the number and success ofSend ()are not equal in number of times. In this case, the receiving end canRecv ()is the return value of0to infer whether the sending end is sent.
throughSetSockOpt ()of theTcp_nodelayoption to disableNaglealgorithm. But the experiment does not seem to be effective, just for the same number ofSend (), set theTcp_nodelayoption afterRecv ()the number of successes is several times more than before the setup. This is not a description set upTcp_nodelayafter that the system will go into maximum effort not to cache. But supposeSendis too fast, it will still be cached.
so. Suppose you don't want the data for Send () to be cached locally until a certain number is sent, but send () How many times it is sent. The safe way is to call the Usleep () function after each send , giving the system a response time.
below The sample demonstrates the send () The speed of the call to the data whether the packaging effect, staring at Server usleep (
Tcp_nodelay is the only option to use the IPPROTO_TCP layer, and the macro tcp_nodelay header file is linux/tcp.h or netinet/ Tcp.h.
I debug a day's program because I do not know the problem of the Send () data cache. My Wuyi Labor Day!!
server.c :
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include < sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/ inet.h> #include <netinet/tcp.h>//#include <linux/tcp.h>int main () {int SOCKSV, sockcl;struct sockaddr_ In Server_addr;struct sockaddr_in client_addr;int sin_size;if ((SOCKSV = socket (af_inet, sock_stream, 0)) = =-1) {printf (" Sever socket fail\n "); return-1;} memset (&server_addr, 0, sizeof (struct sockaddr_in)); server_addr.sin_family = Af_inet;server_addr.sin_port = htons (6001); server_addr.sin_addr.s_addr = Inaddr_any;int r = 1;setsockopt (SOCKSV, Sol_socket, so_reuseaddr, &r, sizeof ( INT.); int t = 1;if ( -1 = = setsockopt (SOCKSV, Ipproto_tcp, Tcp_nodelay, &t, sizeof (int))) {printf ("setsockopt fail\n"); return-1;} if (bind (SOCKSV, struct sockaddr *) &server_addr,sizeof (struct sockaddr)) = =-1) {printf ("Server bind fail\n"); return-1;} if (Listen (SOCKSV, 5) = = -1) {printf ("Server Listen fail\n"); return-1;} while (1) {sin_size = sizeof (struct sockaddr_in), if (Sockcl = Accept (SOCKSV, (struct sockaddr *) &client_addr, & sin_size)) = =-1) {printf ("Server Accept fail\n"); continue;} int times = 1024;int Allbytes = 0;int i;for (i = 0; I < times; i++) {char buf[] = "#this is a message from Ptypeserver"; NT Sendbytes;if ((sendbytes = Send (Sockcl, buf, strlen (BUF), 0)) = =-1) {printf ("Server send Fail\n");} Usleep (+); Allbytes + = sendbytes;} printf ("has send%d packages to client, allbytes=%d\n", Times, Allbytes); close (SOCKCL);}}
client.c :
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include < sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/ Inet.h>int Main () {int Socksv;char buf[1024 * 1024];IF ((SOCKSV = socket (af_inet, sock_stream, 0)) = =-1) {printf ("socket Fail\n "); return-1;} struct sockaddr_in server_addr;memset (&server_addr, 0, sizeof (struct sockaddr_in)); server_addr.sin_family = AF_ Inet;server_addr.sin_port = htons (6001); server_addr.sin_addr.s_addr = inet_addr ("192.168.1.100"); if (Connect (SOCKSV , (struct sockaddr *) &server_addr, sizeof (struct sockaddr)) = =-1) {printf ("Connect fail\n"); return-1;} int times = 0;int Allbytes = 0;int numbytes = 1;while (numbytes! = 0) {times++;if (numbytes = recv (SOCKSV, buf, sizeof (BUF), 0) = =-1) {printf ("recv fail\n"); return-1;} Buf[numbytes] = ' + ';//printf ("numbytes=%d buf=[%s]\n", numbytes, buf); Allbytes + = numbytes;} printf ("Server is closed, with recv%d pAckages from server, "allbytes=%d\n", Times-1, allbytes);}
READ: HTTP://BAIKE.BAIDU.COM/LINK?URL=-QGA0U7IV5TNO-QNORYKDMNAZOEODCGK-PKIVFCOY-N6VHOITKDZLCG1VZYJQJ1DNOLPAAA54E7HRQQX6BC_E_
C-language socket send () data cache problem