Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web服务器只回答来自C套接字的所有GET请求的一部分_C_Sockets_Http - Fatal编程技术网

Web服务器只回答来自C套接字的所有GET请求的一部分

Web服务器只回答来自C套接字的所有GET请求的一部分,c,sockets,http,C,Sockets,Http,我使用C套接字在一台服务器上发送许多GET请求。服务器只回答其中的一部分。Wireshark说所有的数据包都是正确的并已发送。如果我在send()之后调用recv(),直到释放缓冲区为止,并且只在再次调用send()之后,一切正常。如果我为每个send()创建新套接字,服务器也会正确应答。但我需要在不断开连接的情况下将所有请求发送到已连接的套接字。我已经试过TCP_NODELAY了,但没用 UPD关于我正在尝试做什么的简单示例: int tcpSocket = socket(AF_INET, S

我使用C套接字在一台服务器上发送许多GET请求。服务器只回答其中的一部分。Wireshark说所有的数据包都是正确的并已发送。如果我在send()之后调用recv(),直到释放缓冲区为止,并且只在再次调用send()之后,一切正常。如果我为每个send()创建新套接字,服务器也会正确应答。但我需要在不断开连接的情况下将所有请求发送到已连接的套接字。我已经试过TCP_NODELAY了,但没用

UPD关于我正在尝试做什么的简单示例:

int tcpSocket = socket(AF_INET, SOCK_STREAM, 0);

//------------------OPTIONS-------------------------
int flag = 1;
if (setsockopt(tcpSocket, SOL_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)) < 0)
    perror("TCP_NODELAY");
int on = 1;
setsockopt(tcpSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
struct linger lin;
unsigned int y=sizeof(lin);
lin.l_onoff=1;
lin.l_linger=5;
setsockopt(tcpSocket,SOL_SOCKET, SO_LINGER,(void*)(&lin), y);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
if (setsockopt (tcpSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
                sizeof(timeout)) < 0)
    error("setsockopt failed\n");

if (setsockopt (tcpSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,
                sizeof(timeout)) < 0)
    error("setsockopt failed\n");
int enable_keep_alive = 1;
if (setsockopt(tcpSocket, SOL_SOCKET, SO_KEEPALIVE, &enable_keep_alive, sizeof(int)) < 0)
    error("SO_KEEPALIVE");
//-------------------------------------------

connect(tcpSocket, (struct sockaddr *) &serveraddr, sizeof(serveraddr));

do {
  sprintf(request, "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: Keep-alive\r\n\r\n");
  send(tcpSocket, request, strlen(request), 0);
} while (!finish);

shutdown(tcpSocket, 2);
close(tcpSocket);
inttcpsocket=socket(AF_INET,SOCK_STREAM,0);
//------------------选择权-------------------------
int标志=1;
if(setsockopt(tcpSocket,SOL_TCP,TCP_NODELAY,(char*)和flag,sizeof(int))<0)
perror(“TCP_NODELAY”);
int on=1;
setsockopt(tcpSocket,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
林林格结构;
无符号整数y=sizeof(lin);
lin.l_onoff=1;
林林格=5;
setsockopt(tcpSocket,SOL_SOCKET,SO_LINGER,(void*)(&lin),y);
结构timeval超时;
timeout.tv_sec=5;
timeout.tv_usec=0;
if(setsockopt)(tcpSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)和超时,
sizeof(超时))<0)
错误(“setsockopt失败\n”);
if(setsockopt)(tcpSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)和超时,
sizeof(超时))<0)
错误(“setsockopt失败\n”);
int enable_keep_alive=1;
if(setsockopt(tcpSocket、SOL_SOCKET、SO_KEEPALIVE和enable_keep_alive,sizeof(int))小于0)
错误(“sou KEEPALIVE”);
//-------------------------------------------
连接(tcpSocket,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
做{
sprintf(请求,“GET/HTTP/1.1\r\n主机:127.0.0.1\r\n连接:保持活动\r\n\r\n”);
发送(tcpSocket,请求,strlen(请求),0);
}而(!完成);
停机(tcpSocket,2);
关闭(tcpSocket);
UPD
也许我的问题不是很清楚,抱歉,我想做的是在不等待响应或重新创建套接字的情况下向一台服务器发送大量请求。因此,我需要尽可能快地向一台服务器发送大量请求,但recv和重新创建套接字正在减慢该程序的速度。

您是否设置了标头?是的。服务器保持连接。逐个发送请求怎么样?我的意思是你发送请求,然后等待响应,然后再发送另一个请求。。。是的,它是这样工作的。正如我所说的“如果我在send()之后调用recv(),直到释放缓冲区,并且只在再次调用send()之后,一切正常。”只是一个猜测。如果不调用
recv
服务器的发送缓冲区变满,服务器会将此情况解释为连接问题并关闭连接。