2013-04-12 58 views
1

我在寫一個使用Winsock的服務器程序,它等待客戶端連接。該代碼是這樣的:accept()函數充當非阻塞

#include <winsock.h> 
#pragma comment(lib, "wsock32.lib") 

WSADATA wsaData; 
WSAStartup(0x101, &wsaData); 
SOCKET listeningSocket; 
listeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 

SOCKADDR_IN serverInfo; 
serverInfo.sin_family = AF_INET; 
serverInfo.sin_addr.s_addr = INADDR_ANY; 
serverInfo.sin_port = htons(80); 

bind(listeningSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)); 
listen(listeningSocket, 5); 

SOCKET theClient; 
while(true) 
{ 
    theClient = accept(listeningSocket,NULL,NULL); 
    .... 
    recv(theClient,Message,strlen(Message),0); 
    .... 
    .... 
} 

我遇到的問題是,服務器不等待客戶端,並繼續執行後accept()函數。具體來說,accept()函數不會阻止執行。

回答

1

您應該檢查所有庫函數的返回值。這可能是因爲早期通話(例如bind())失敗,但您從未發現,因爲您忽略了返回值。

+0

你是對的! 'bind()'不起作用。你能告訴我有什麼問題嗎? – Faheem

+0

@Faheem:看看錯誤代碼。有幾種可能的原因(例如,可能有東西已經在端口80上收聽)。 – NPE

+0

看起來就是這樣的問題。當我將端口更改爲某個較大的值時,它可以正常工作。但是我必須使用80端口。這是一個必要的要求。 – Faheem

0

嘗試打印輸出上的錯誤信息接受,它可能與你所遇到的問題幫助(你也應該綁定做到這一點。)

綁定錯誤檢查:

int result; 
result = bind(listeningSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)); 
if (result == SOCKET_ERROR) { 
    printf("bind failed with error: %d\n", WSAGetLastError()); 
    freeaddrinfo(serverInfo); 
    closesocket(listeningSocket); 
    WSACleanup(); 
    return 1; 
} 

接受錯誤檢查:

theClient = INVALID_SOCKET; 

// Accept a client socket 
theClient = accept(listeningSocket, NULL, NULL); 
if (theClient == INVALID_SOCKET) { 
    printf("accept failed: %d\n", WSAGetLastError()); 
    closesocket(listeningSocket); 
    WSACleanup(); 
    return 1; 
} 

更多信息,請看:

http://msdn.microsoft.com/en-ca/library/windows/desktop/ms737593(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/bb530751(v=vs.85).aspx