Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
为什么阻塞套接字会重复返回0长度的数据? 在C++程序中,使用标准的BSD风格的套接字,我遇到了一个重要的问题。在下面的代码中,我连接到本地web服务器,发送请求,然后创建一个循环,等待数据返回。我确实收到了数据,但随后我得到了源源不断的0长度数据,就好像它是一个非阻塞套接字一样。web服务器可能没有终止连接,因为如果是这样,我将收到长度为-1的消息_C++_C_Networking_Network Programming_Sockets - Fatal编程技术网

为什么阻塞套接字会重复返回0长度的数据? 在C++程序中,使用标准的BSD风格的套接字,我遇到了一个重要的问题。在下面的代码中,我连接到本地web服务器,发送请求,然后创建一个循环,等待数据返回。我确实收到了数据,但随后我得到了源源不断的0长度数据,就好像它是一个非阻塞套接字一样。web服务器可能没有终止连接,因为如果是这样,我将收到长度为-1的消息

为什么阻塞套接字会重复返回0长度的数据? 在C++程序中,使用标准的BSD风格的套接字,我遇到了一个重要的问题。在下面的代码中,我连接到本地web服务器,发送请求,然后创建一个循环,等待数据返回。我确实收到了数据,但随后我得到了源源不断的0长度数据,就好像它是一个非阻塞套接字一样。web服务器可能没有终止连接,因为如果是这样,我将收到长度为-1的消息,c++,c,networking,network-programming,sockets,C++,C,Networking,Network Programming,Sockets,请忽略我下面的简单输入错误,因为我是从内存中编写代码的,而不是直接复制/粘贴。该代码在OSX和Windows上产生相同的结果 int sock = socket(AF_INET, SOCK_STREAM, 0); //assume serv_addr has been created correctly connect(sock, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0); std::string header = "GET

请忽略我下面的简单输入错误,因为我是从内存中编写代码的,而不是直接复制/粘贴。该代码在OSX和Windows上产生相同的结果

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

//assume serv_addr has been created correctly
connect(sock, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0);

std::string header = "GET / HTTP/1.1\r\n"
    "Host: 127.0.0.1:80\r\n"
    "Keep-Alive: 300\r\n"
    "Connection: keep-alive\r\n\r\n";

send(sock, header.c_str(), header.length()+1, 0);

for (;;) {
    char buffer[1024];
    int len = recv(sock, buffer, 1024, 0);
    cout << len << endl;
    //this outputs two numbers around 200 and 500,
    //which are the header and html, and then it
    //outputs and endless stream of 0's
}
intsock=socket(AF\u INET,sock\u STREAM,0);
//假设已正确创建服务地址
连接(sock,(sockaddr*)&serv_addr,sizeof(serv_addr))<0;
std::string header=“GET/HTTP/1.1\r\n”
“主机:127.0.0.1:80\r\n”
“保持活动状态:300\r\n”
“连接:保持活动\r\n\r\n”;
发送(sock,header.c_str(),header.length()+1,0);
对于(;;){
字符缓冲区[1024];
int len=recv(sock,buffer,1024,0);

从recv的手册页上看

For TCP sockets, the return value 0 means the peer has closed its half
     side of the connection.

从recv的手册页

For TCP sockets, the return value 0 means the peer has closed its half
     side of the connection.

当recv()返回0时,连接已关闭;但是如果要轮询(或等待)套接字以获取传入数据,请查看select()的手册页。哇,谢谢,我想这是我的误解,但如果我指定“保持活动”,它为什么要关闭连接?
连接:keep alive
只是一个建议;HTTP/1.1服务器不必遵守它,较旧的服务器甚至不知道它的意思。但更重要的是,一个适当的防御客户端总是为服务器断开连接做好准备,而不管协议是否允许它在状态机中的该点这样做。When recv()返回0,连接已关闭;但是如果要轮询(或等待)套接字以获取传入数据,请查看select()的手册页。哇,谢谢,我想这是我的误解,但是如果我指定“保持活动”,它为什么要关闭连接?
连接:keep alive
只是一个建议;HTTP/1.1服务器不必遵守它,较旧的服务器甚至不知道它的意思。但更重要的是,一个适当的防御客户端总是为服务器断开连接做好准备,不管协议是否允许它在状态机中的该点执行该操作。否,如果客户端出现错误,recv将只返回-1。如果服务器与您断开连接,您将得到0,这基本上类似于EOF。不,如果客户端出现错误,recv将只返回-1。如果服务器与您断开连接,您将得到0,这基本上类似于EOF。