2017-07-18 153 views
-1

我試圖創建一個服務器客戶端,所以我可以有一個更好的理解他們是如何工作的,但是我遇到了問題,每當我使listen()調用窗口給我一個錯誤代碼10045,我查了一下,它似乎是因爲該操作不被支持,但我很困惑,爲什麼發生這種情況,因爲從我所瞭解的listen()調用應該工作在TCP套接字。下面是我如何初始化插座Windows的TCP套接字錯誤10045

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

int sockfd, n; 
struct addrinfo hints, *servinfo; 

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; 
hints.ai_protocol = SOCK_STREAM; 
hints.ai_flags = AI_PASSIVE; 

if((n = getaddrinfo(NULL, argv[1], &hints, &servinfo)) != 0){ 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(n)); 
    return EXIT_FAILURE; 
} 
if((sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) < 0){ 
    fprintf(stderr, "%d\n", WSAGetLastError()); 
    perror("socket"); 
    return EXIT_FAILURE; 
} 
if((n = bind(sockfd, servinfo->ai_addr, servinfo->ai_addrlen)) == -1){ 
    fprintf(stderr, "%d\n", WSAGetLastError()); 
    perror("bind"); 
    return EXIT_FAILURE; 
} 
if(listen(sockfd, 1) == -1){ //error 
    fprintf(stderr, "%d\n", WSAGetLastError()); 
    perror("listen"); 
    return EXIT_FAILURE; 
} 
+0

如果您閱讀['listen'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms739168(v = vs.85).aspx)參考,您會看到['WSAEOPNOTSUPP'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v = vs.85).aspx#WSAEOPNOTSUPP)(你得到的錯誤)意味着你嘗試使用不支持監聽的套接字。檢查'servinfo'結構的內容以確保它全部有效。或者遍歷'servinfo'列表,直到所有調用都成功(這是處理它的常用方法)。 –

回答

1

您設置了錯誤的協議/插座類型的源代碼:

hints.ai_protocol = SOCK_STREAM; 

如果你讀the addrinfo structure reference插槽類型應該在ai_socktype領域:

hints.ai_socktype = SOCK_STREAM; 

既然你設置了錯誤的ai_protocolsocket通話將創建錯誤類型插座的你,和listen通話將失敗。

這裏的教訓是總是閱讀文檔。