【问题标题】:How can I get the connected client's IP address using WinSock2 and C?如何使用 WinSock2 和 C 获取已连接客户端的 IP 地址?
【发布时间】:2013-05-18 22:34:37
【问题描述】:

我想获取刚刚连接到运行 WinSock2 的服务器的客户端的 IP 地址。我正在使用 C。

【问题讨论】:

  • 我到处都看到这个问题,但我真的无法让他们的解决方案适用于我的情况!
  • 然后发布您的实际代码的相关部分并准确地描述哪些内容无法使用它。 (通过editing 你的问题来做到这一点。)(链接问题的第二个答案包含一个示例 sn-p。)
  • 现在可以了,我使用了 inet_ntoa() SOCKADDR_IN sinInfo; ...... char* ip = inet_ntoa(sinInfo.sin_addr);

标签: c ip client winsock


【解决方案1】:

您可以通过调用accept()获取客户端的IP地址和端口。

只需将适当的数据传入最后两个参数即可。

struct sockaddr_in sa = {0}; /* for TCP/IP */
socklen_t socklen = sizeof sa;
... = accept(..., (struct sockaddr *) &sa, &socklen);

详情please read here

【讨论】:

  • 根据文档:“addrlen [in, out] 一个可选指针,指向一个整数,其中包含 addr 参数指向的结构长度。”。所以socklen的初始化是错误的,它应该是socklen = sizeof(sockaddr),否则accept会失败,错误WSAEFAULT
  • @Mouin: Ups,是的,socklen 需要根据传递的地址的结构的大小进行初始化。谢谢。
【解决方案2】:

自己没做过,看看getpeername。看起来这就是你需要的。

【讨论】:

  • 谢谢,希望能在WINSOCK2中使用!
【解决方案3】:

我在 winsock2 上工作。不需要 getpeername

SOCKET newConnection;
SOCKADDR_IN addr;
int addrlen = sizeof(addr);

newConnection = accept(sListen, (SOCKADDR*)&addr, &addrlen);

char *ip = inet_ntoa(addr.sin_addr);
printf("Accepted Connection from :  %s", ip);

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2018-11-15
    • 2021-01-27
    相关资源
    最近更新 更多