Tcp Socket recv 函数不起作用 c++
Tcp Socket recv function doesn't work c++
我正在处理的问题是,在成功发送数据后,我收到了来自客户的第一个响应,但在他输入详细信息但没有提交后收到了第二个响应。
你知道为什么会这样吗?
这是我的代码:
sock->listenAndAccept();
string url="HTTP/1.1 302 Found \r\nContent-Type: text/html; charset=utf8 \r\nContent- Length:279\r\n\r\n<!DOCTYPE html><html><head><title>Creating an HTML Element</title></head><body><form name=\"input\" action=\"login.html\" method=\"get\">user name: <input type=\"text\" name=\"user\"><br>password: <input type=\"text\" name=\"password\"><input type=\"submit\" value=\"Submit\"></form></body></html>";
sock->send(url.data(),url.length());
char buffer[1000];
sock->recv(buffer, 1000);
cout<<buffer<<endl;
sock->recv(buffer, 1000);
cout<<buffer<<endl;
收听功能:
TCPSocket* TCPSocket::listenAndAccept(){
int rc = listen(socket_fd, 1);
if (rc<0){
return NULL;
}
size_t len = sizeof(peerAddr);
bzero((char *) &peerAddr, sizeof(peerAddr));
int connect_sock = accept(socket_fd, (struct sockaddr *)&peerAddr,(unsigned int *)&len);
return new TCPSocket(connect_sock,serverAddr,peerAddr);
}
接收函数:
int TCPSocket::recv(char* buffer, int length){
return read(socket_fd,buffer,length);
}
TCP 是面向流的协议。您可能已经阅读了 first recv 中的所有消息。检查接收到的数据大小,看是否符合预期输出。
总是总是总是(我说得不够频繁)检查 recv
的 return 值。 recv
将读取 最多 您请求的数量。如果您确定您请求的金额正在发送,那么您必须进入一个循环 recv
缓冲传入数据,直到您收到您期望收到的数据。
当您使用非常快速的本地主机接口在本地计算机上进行测试时,这种错误往往会潜伏在那里,然后在您启动 运行 不同主机上的客户端和服务器时立即浮出水面。
当您从测试代码转到实际代码时,您还必须处理零长度响应(客户端关闭套接字)和错误代码(<0 响应)。
最后,请post您的客户端代码。那里也可能有错误。
我正在处理的问题是,在成功发送数据后,我收到了来自客户的第一个响应,但在他输入详细信息但没有提交后收到了第二个响应。 你知道为什么会这样吗? 这是我的代码:
sock->listenAndAccept();
string url="HTTP/1.1 302 Found \r\nContent-Type: text/html; charset=utf8 \r\nContent- Length:279\r\n\r\n<!DOCTYPE html><html><head><title>Creating an HTML Element</title></head><body><form name=\"input\" action=\"login.html\" method=\"get\">user name: <input type=\"text\" name=\"user\"><br>password: <input type=\"text\" name=\"password\"><input type=\"submit\" value=\"Submit\"></form></body></html>";
sock->send(url.data(),url.length());
char buffer[1000];
sock->recv(buffer, 1000);
cout<<buffer<<endl;
sock->recv(buffer, 1000);
cout<<buffer<<endl;
收听功能:
TCPSocket* TCPSocket::listenAndAccept(){
int rc = listen(socket_fd, 1);
if (rc<0){
return NULL;
}
size_t len = sizeof(peerAddr);
bzero((char *) &peerAddr, sizeof(peerAddr));
int connect_sock = accept(socket_fd, (struct sockaddr *)&peerAddr,(unsigned int *)&len);
return new TCPSocket(connect_sock,serverAddr,peerAddr);
}
接收函数:
int TCPSocket::recv(char* buffer, int length){
return read(socket_fd,buffer,length);
}
TCP 是面向流的协议。您可能已经阅读了 first recv 中的所有消息。检查接收到的数据大小,看是否符合预期输出。
总是总是总是(我说得不够频繁)检查 recv
的 return 值。 recv
将读取 最多 您请求的数量。如果您确定您请求的金额正在发送,那么您必须进入一个循环 recv
缓冲传入数据,直到您收到您期望收到的数据。
当您使用非常快速的本地主机接口在本地计算机上进行测试时,这种错误往往会潜伏在那里,然后在您启动 运行 不同主机上的客户端和服务器时立即浮出水面。
当您从测试代码转到实际代码时,您还必须处理零长度响应(客户端关闭套接字)和错误代码(<0 响应)。
最后,请post您的客户端代码。那里也可能有错误。