2013-05-21 43 views
-1

我目前正在編寫一個C++模塊,它創建一個套接字服務器線程,每隔1ms輪詢accept()函數。我有一個測試模塊,它欺騙了一個也在運行的客戶端連接。測試模塊啓動創建服務器線程。線程創建並驗證爲正在運行後,客戶端將運行connect()命令作爲測試。我的代碼指出連接已建立,在connect命令上返回0。但是,在我的服務器線程中運行的accept()從不接收連接。C++ Socket Connection自動建立?

服務器綁定到接受任何IP:50000,並在客戶端未綁定,但是具有127.0.0.1:50000組作爲其目的地。我的Linux環境是否自動接受此連接?

這裏是我的服務器的套接字代碼:

int nSocket; 
int nOn = 1; 
int nControl; 
struct sockaddr_in sServerAddress; 

nSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
if(nSocket < 0) 
{ 
    std::cout << "Failed to create socket\n"; 
} 
if(setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR, &nOn, sizeof(int)) < 0) 
{ 
    std::cout << "failed to set socket option\n"; 
} 
nControl = fcntl(nSocket, F_GETFL); 
if(fcntl(nSocket, F_SETFL, O_NONBLOCK | nControl) < 0) 
{ 
    std::cout << "set not blocking failed\n"; 
} 

memset(&sServerAddress, 0x00, sizeof(struct sockaddr_in)); 
sServerAddress.sin_family = AF_INET; 
sServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); 
sServerAddress.sin_port = htons(mtListenPort); 

if(bind(nSocket, (struct sockaddr*)&sServerAddress, sizeof(struct sockaddr_in)) < 0) 
{ 
    std::cout << errno << "bind failed\n"; 
} 

if(listen(nSocket, MAXPENDING) < 0) 
{ 
    std::cout << "listen failed\n"; 
} 

這裏是我的測試客戶端的插口代碼:

int nSocket; 

nSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
if(nSocket < 0) 
{ 
    std::cout << "Failed to create socket\n"; 
} 

struct sockaddr_in serverAddress; 
serverAddress.sin_family = AF_INET; 
inet_aton(LOCAL_HOST, &serverAddress.sin_addr); 
serverAddress.sin_port = htons(LISTEN_PORT00); 
char msg[] = "Hello World."; 

usleep(10000); 

if (connect(nSocket, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) 
{ 
    std::cout << errno << "Could not connect to the server.\n"; 
} 

usleep(10000); 

if (sendto(nSocket, msg, strlen(msg), 0, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) 
{ 
    std::cout << errno << "Could not send data to the server.\n"; 
} 

這裏是線程的一小部分運行在接受碼。

while(mbListening) 
{ 
    nMessengerSocket = accept(mnSocket, (struct sockaddr*)&sClientAddr, &tClientAddrLength); 
    if(nMessengerSocket >= 0) 
    { 
     std::cout << "Accepted connection from " << inet_ntoa(sClientAddr.sin_addr) << std::endl; 
     mnConnections++; 
     mbListening = false; 
    } 
    mThreadRunningTime++; 
    usleep(1000); 
} 
+1

你在哪裏調用'accept()'? –

+0

哦,我的錯。我在線程中運行的循環中調用它。我會更新代碼。 – jetbomber117

+1

不要每隔1ms輪詢一次!你到底在做什麼?使用阻塞套接字或選擇! –

回答

2

確保tClientAddrLength呼籲accept()之前初始化爲sizeof sClientAddr。這是一個常見的錯誤。

不要默默地忽略錯誤。檢查errno中的錯誤代碼,因爲它告訴你出了什麼問題。

1

您使用的是sendto?這是爲UDP ...使用send

此外,檢查該端口是否是自由的:

telnet localhost 50000 

netstat -a