【问题标题】:Tcp Socket recv function doesn't work c++Tcp Socket recv函数不起作用c ++
【发布时间】:2015-03-09 21:49:27
【问题描述】:

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

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

【问题讨论】:

  • Content-Length: 之间的空格是怎么回事?
  • 另外,客户端是你写的吗?你怎么知道客户端正在发送响应? (我怀疑你的客户端是一个网络浏览器,它正在打开一个新的连接[这没有错])
  • 我使用网络浏览器作为我的客户端
  • 你不能。这就像在问“我如何确保如果我在两个不同的日子订购披萨,他们使用同一辆车?”。 (答案是,如果你关心你的披萨是在哪辆车上来的,那你就错了)
  • “那么你认为我需要在我的代码中改变什么” - 我认为你需要了解 HTTP 的工作原理,然后它就会很明显(你可能需要扔掉一部分它并重新开始)

标签: c++ sockets tcp client-server tcpsocket


【解决方案1】:

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

【讨论】:

  • 不,这是不可能的。我一步一步调试程序,并在第一次recv完成后将用户名和密码的详细信息放在网站上。然后第二个recv什么也没得到,网站只是加载和加载
  • 一无所获=等待数据但一无所获。他还在等着呢
  • 我确信在您用数据填写 2 个字段并单击按钮后,有一些内容可供阅读。
  • 客户端需要发送数据才能被服务器读取。仅填充已经发送的缓冲区将无济于事。如果可能,请发布客户端代码。
  • 我的客户端是浏览器
【解决方案2】:

总是总是总是(我不能这么说)检查recv 的返回值。 recv 将读取最多您请求的金额。如果您确定您所请求的数量正在发送中,那么您必须围绕recv 循环缓冲传入数据,直到您收到预期接收的数据。

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

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

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

【讨论】:

  • 没有客户端代码。我的客户端是一个网络浏览器。并且在第一次recv的返回值只是一个接受站点已经启动然后它只是卡在recv函数中等待响应而不继续前进
  • 您是说浏览器确实读取了您的页面并且您可以在页面中输入凭据,但您没有看到表单提交?如果是这种情况,请记住现代浏览器能够同时打开多个到网站的连接,并在他们认为合适的时候使用它们来提高性能。浏览器可能已经放弃了您的“站点”,因为它有一个连接挂起并挂在您的收听积压中。
猜你喜欢
  • 2018-12-18
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多