TCP recvfrom()不存储'from'

时间:2012-10-13 13:19:13

标签: c++ tcp ip-address recv

我正在使用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消息来查看是否应该检查数据包。接收数据有效,我可以阅读它和一切。但recvIn变量不会被recvfrom改变。所以,当我做cout&lt;&lt; inet_ntoa(recvIn.sin_addr)&lt;&lt; “\ n”它写“0.0.0.0”。我已经google了这个问题,大多数有这个问题的人忘了初始化recv_length。但我很确定我在这里做得对。谁能看到我做错了什么?或者我是否需要使用正在发送的数据进行更改?传入的数据是否可能没有IP地址。这是我非常怀疑的,因为我正在使用TCP。

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

2 个答案:

答案 0 :(得分:5)

TCP是面向连接的协议。 fromfromlen旨在用于无连接协议,例如UDP。根据{{​​3}},recvfrom会忽略fromfromlen面向连接的套接字。

答案 1 :(得分:3)

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