2014-03-13 24 views
0

這是我的代碼,它可以運行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; 
} 

當我試圖通過這個節目與乳寧拖進程綁定同一個端口,就必須有一個已經解決使用類似下面的消息。

[第一PROC @ CENTOS]

$ ./udp 
############# Binding port 12345 type Enter to stop 

[第二PROC @ CENTOS]

$ ./udp 
bind() ret = -1 errno =98 : Address already in use 
$ 

然而,當我做同樣的事情上窗口相同的代碼,消息是不同的。

[第一PROC @窗口]

C:\ >udp 
############# Binding port 12345 type Enter to stop 

[第二PROC @窗口]

C:\ >udp 
bind() ret = -1 errno =34 : Result too large 

C:\ > 

我怎麼能在Windows上使用獲取地址了嗎?

回答

1

我不認爲你應該在windows上使用errno作爲套接字代碼。您可以嘗試使用WSAGetLastError,它返回WSAEADDRINUSE

MSDN page for errno暗示EADDRINUSE不支持errno。

我認爲你應該設計一個方案,你有一個my_errno功能,取決於平臺使用errnoWSAGetLastError


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

可能有此調用一個微妙的問題。參數評估的順序未指定,並且strerror本身可以更改爲errno,這意味着它有副作用。在做其他事情之前,您應該分別打印errno

1

像cnicular說的,你必須在Windows上使用WSAGetLastError(),而不是errno。要獲取套接字錯誤代碼的文本消息,可以使用FormatMessage()

要回答你的問題,如果你想知道誰在使用端口,你可以使用命令行netstat工具,或者可編程地使用GetTcpTable2()

相關問題