gpt4 book ai didi

c - 使用 winsock 套接字 API 检索端口号

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:23 25 4
gpt4 key购买 nike

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

#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,我得到以下值:
enter image description here

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

最佳答案

getsockname() 返回本地端口号。因为当你调用 connect() 时你的套接字没有绑定(bind)到特定的本地端口,一个随机的 ephemeral port被选中,端口 56179。

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

关于c - 使用 winsock 套接字 API 检索端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30603309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com