0

我正在处理的问题是,在成功发送数据后,我收到了客户的第一个响应,但第二个响应是在他输入详细信息后没有提交。你知道为什么会这样吗?这是我的代码:

    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);
}
4

2 回答 2

1

TCP是面向流的协议。您可能已经阅读了第一个 recv 中的所有消息。检查接收到的数据的大小,看看它是否与预期的输出匹配。

于 2015-01-12T06:55:53.060 回答
0

总是总是总是(我不能经常这么说)检查recv. recv将读取您要求的金额。如果您确定您请求的数量正在发送中,那么您必须进入一个循环recv缓冲传入数据的循环,直到您收到您期望收到的数据。

当您使用非常快速的 localhost 接口在本地计算机上进行测试时,这种错误往往会潜伏在看不见的地方,然后在您开始在不同主机上运行客户端和服务器时立即浮出水面。

当您从测试代码转到实际代码时,您还必须处理零长度响应(客户端关闭套接字)和错误代码(<0 响应)。

最后,请发布您的客户端代码。那里也可能有错误。

于 2015-01-12T09:32:56.367 回答