【问题标题】:Retrieving port number using winsock sockets API使用 winsock 套接字 API 检索端口号
【发布时间】:2015-06-02 17:59:53
【问题描述】:

虽然我确实从下面的代码段中得到了端口号的非零值,但返回的端口值与用于建立套接字的端口值不匹配:

#include <winsock2.h>

int main(void)
{
    SOCKADDR_IN server;
    WSADATA wsa;
    SOCKET s;
    DWORD dwTime = 1000;

    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        //handle error
    }
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        //handle error
    }

    if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&dwTime, sizeof(dwTime)) == SOCKET_ERROR)
    {
        //handle error
    } 

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 5000 );

    //Connect to server
    if(connect(s , (struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
    {
        //handle error
    }

    //read port number
    size_t lensin = sizeof(server);
    if (getsockname(s, (struct sockaddr *)&server, &lensin) == SOCKET_ERROR)
        perror("getsockname");
    else
    {
        printf("port number, no byte order reversal: %u\n", server.sin_port);
        printf("port number, with byte order reversal: %u\n", ntohs(server.sin_port));
    }
    return 0;
}

对于端口 5000,我得到以下值:

有或没有字节顺序反转(使用ntohs()),值仍然不一样。如何读取最初用于建立连接的端口号的整数值?

【问题讨论】:

  • 附带说明,调用connect() 的行在if 语句的末尾有一个错误的;,因此handle error 代码将始终被执行。跨度>
  • @RemyLebeau - 已编辑,(减少这篇文章的原始代码时的疏忽。谢谢。)

标签: c sockets winsock


【解决方案1】:

getsockname() 返回本地端口号。由于调用 connect() 时套接字未绑定到特定的本地端口,因此随机选择了一个 ephemeral port,端口 56179。

如果您想要连接的端口号,请使用getpeername()

【讨论】:

  • 做到了。网络新手,我不知道getpeername()。谢谢
  • 这就是为什么你需要注意文档。 getsockname(): "getsockname 函数检索 套接字的本地名称" getpeername(): "getpeername 函数检索 套接字连接到的对等体
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2011-02-11
  • 2015-02-03
  • 2016-06-20
  • 2013-04-02
相关资源
最近更新 更多