Web服务器仅响应来自C套接字的所有GET请求的一部分

时间:2014-03-28 10:35:23

标签: c sockets http

我使用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);

UPD 也许我的问题不是很清楚,对不起,我想做的是将大量请求发送到一台服务器而无需等待响应或重新创建套接字。所以我需要尽可能快地向一台服务器发送大量请求,但是recv和重新创建套接字正在减慢这个程序。

0 个答案:

没有答案