sockets - 如何找到已经在使用的地址?

标签 sockets error-handling port winsock

这是我的代码,它可以运行 CentOS 和 Windows,只是修复了一些标题。

#define _WIN32_WINNT 0x0501
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
/*
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
*/

int main()
{
 int sock;
 int ret = 0;
 int port= 12345;
 struct sockaddr_in addr;
 char buf[1024];

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);

 sock = socket(AF_INET, SOCK_STREAM, 0);
 if(sock<0){
        printf("socket() ret = %d : %s\n",ret,strerror(errno));
        return ret;
 }
 addr.sin_family = AF_INET;
 addr.sin_port = htons(port);
 addr.sin_addr.s_addr = INADDR_ANY;

 ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
 if(ret<0){
        printf("bind()  ret = %d errno =%d : %s\n",ret,errno,strerror(errno));
        return ret; 
 }
    printf("#############  Binding port %d type Enter to stop \t",port);
    fgets(buf,sizeof(buf),stdin);

 return 0;
}

当我尝试通过该程序将同一端口与正在运行的拖曳进程绑定(bind)时,必须有地址已在使用中的消息,如下所示。

[第一个proc@centOS]
$ ./udp
#############  Binding port 12345 type Enter to stop

[第二个proc@centOS]
$ ./udp
bind()  ret = -1 errno =98 : Address already in use
$

但是,当我在 Windows 上使用相同的代码做同样的事情时,消息是不同的。

[第一个proc@windows]
C:\ >udp
#############  Binding port 12345 type Enter to stop

[第二个proc@windows]
C:\ >udp
bind()  ret = -1 errno =34 : Result too large

C:\ >

如何获取已在 Windows 上使用的地址?

最佳答案

我认为你不应该使用 errno在 windows 上获取套接字代码。您可以尝试使用 WSAGetLastError返回 WSAEADDRINUSE .

MSDN page for errno建议 EADDRINUSE不支持 errno。

我认为你应该设计一个方案,你有一个 my_errno根据平台使用的函数errnoWSAGetLastError .

printf("socket() ret = %d : %s\n",ret,strerror(errno));


这个调用可能存在一个微妙的问题。参数评估的顺序未指定,strerror本身可以改变errno ,这意味着它有副作用。您应该打印 errno分开,在做任何其他事情之前。

关于sockets - 如何找到已经在使用的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22373437/

相关文章:

c# - 使用C#隧道HTTP,HTTPS和DNS

c++ - 使用 WinSock2 开发,CreateThread() 函数出错

Excel VBA - 网页抓取 - 跟踪包裹 - 处理跟踪号不正确的错误

vba - 检查工作表名称以避免重复

docker - 如何使我的dockerized Python应用程序在2个单独的端口上输出?

Java RMI 和 https?

http - 如何在 http.ListenAndServe 中使用下一个可用端口

java - Google App Engine HTTP ERROR 503 错误

java - java中的多线程客户端套接字

python - python - 如何在python的另一个模块中排除ValueError?