【发布时间】: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