2013-10-08 48 views
0

在我的程序的服務器端,當程序遇到accept函數時,它等待連接。發現連接傳入後(與我的客戶端連接後),accept()方法返回1.基於該返回,它嘗試接收併發送到套接字1,這是一個錯誤的套接字。Windows套接字accept()返回錯誤值

這是從我的服務器的一些代碼:

for(;;) 
{ 
    if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR) 

連接後發現sConnect有1

爲什麼會發生這種情況的價值?我該如何解決它?

+2

添加一些括號周圍'sConnect =接受(sListen, (SOCKADDR *)&addr,&addrlen)' –

+1

我會讓這兩行代碼更具可讀性,並避免此錯誤,並警告編譯器應爲該代碼發出警告。 – drescherjm

回答

3

因爲你比較的accept值與SOCKET_ERROR回來,這個布爾分配給sConnect

if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR) 

個人而言,我不喜歡這麼長的線。分開作業和比較:

sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen); 
if(sConnect != SOCKET_ERROR) 
... 

或至少添加括號。

5

在Windows上,如果accept()失敗,則返回INVALID_SOCKET,而不是SOCKET_ERROR

真正的問題是您的if()語句同時執行賦值和比較,但缺少賦值所需的一組括號,因此它實際上比較了與您期望值不同的值。做到這一點,而不是:

if((sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen)) != INVALID_SOCKET) 

更好的選擇是對的分配和比較分開:

sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen); 
if(sConnect != INVALID_SOCKET) 
1

試試這個:

sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen); 
if(sConnect != INVALID_SOCKET)