[英]C on Windows: Bind to a free random port and get the port number
在Linux上,我會這樣做:
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(0);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
perror("ERROR on binding");
*err = -2;
}
struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sockfd, (struct sockaddr *)&sin, &len) == -1)
{
*err = -2;
perror("getsockname");
}
在Windows中,我有:
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
//using 0 instead of DEFAULT_PORT gives me host not found.
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
socklen_t len = sizeof(result->ai_addr);
printf("Port number: %d", getsockname(ListenSocket, result->ai_addr, &len));
iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
freeaddrinfo(result);
iResult = listen(ListenSocket, 4);
謝謝
Windows在這里與Linux相同。
您的Linux代碼不只可以在Windows上運行嗎? 確實,除了一些特殊情況和初始化Winsock( https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms742213 ( v= vs 。 85).aspx )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.