2

我正在使用 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 << inet_ntoa(recvIn.sin_addr) << "\n" 时,它会写入 "0.0.0.0"。我用谷歌搜索了这个问题,大多数遇到这个问题的人都忘记了初始化recv_length。但我很确定我在这里做得对。谁能看到我做错了什么?还是我需要对正在发送的数据进行一些更改?传入的数据是否可能没有 IP 地址。这是我高度怀疑的,因为我使用的是 TCP。

谢谢你的时间,我希望我能解决这个问题!

4

2 回答 2

5

TCP 是一种面向连接的协议。from并且fromlen旨在与无连接协议(例如 UDP)一起使用。根据文档recvfrom忽略fromfromlen用于面向连接的套接字。

于 2012-10-13T13:33:50.430 回答
3

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

于 2012-10-13T13:33:04.260 回答