【问题标题】:TCP recvfrom() doesn't store 'from'TCP recvfrom() 不存储“来自”
【发布时间】:2012-10-04 02:52:56
【问题描述】:

我正在使用 TCP 制作一个服务器程序,我想获取我刚刚收到的消息的发送者的 IP 地址。这是我的代码:

case FD_READ:
{    //Incoming data; get ready to receive
    char buffer[DEFAULT_BUFLEN];
    int bytes_received; 
    memset(buffer, '\0', sizeof(buffer));

    struct sockaddr_in recvIn;
    int recv_length = sizeof(struct sockaddr);

    memset((void *)&recvIn, '\0', recv_length);

    bytes_received = recvfrom(wParam, buffer, DEFAULT_BUFLEN, 0, (struct sockaddr *)&recvIn, &recv_length);
    cout << inet_ntoa(recvIn.sin_addr) << "\n";

    break;
}

所以我正在使用 Windows 消息来查看是否应该检查数据包。接收数据有效,我可以阅读它和一切。但 recvfrom 不会改变 recvIn 变量。因此,当我执行 cout

感谢您的宝贵时间,希望我能解决这个问题!

【问题讨论】:

  • 我也想知道,为什么 fromlen(recvfrom 的最后一个参数)需要是一个指针,为什么不只是数字本身?这似乎毫无意义。
  • 它必须是一个指针,因为这些 API 在编写时考虑到了未来的扩展。你可以给它一些非描述性的缓冲区并传入它的长度,它会将缓冲区填充到结构的当前大小,并用实际使用的长度填充长度指针。
  • struct sockaddr_in recvIn; int recv_length = sizeof(struct sockaddr); 是可疑的:您没有将 sizeof 应用于您传递的结构的类型。您是否尝试过更接近文档中示例的代码? (msdn.microsoft.com/en-us/library/windows/desktop/…)?
  • @JoãoMendes 是的,它是一个基于连接的套接字(它是 TCP),所以就是这样!谢谢:D
  • 但是当多个连接到我的服务器时(这是应该发生的)我如何知道哪些数据对应于哪个客户端?

标签: c++ tcp ip-address recv


【解决方案1】:

TCP 是一种面向连接的协议。 fromfromlen 旨在用于无连接协议,例如 UDP。根据documentationrecvfrom 忽略了面向连接的套接字的fromfromlen

【讨论】:

    【解决方案2】:

    对于已连接的 TCP 套接字,应使用getpeername() 获取远程套接字的地址。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2014-10-24
    • 2018-06-19
    相关资源
    最近更新 更多