2010-06-16 129 views
4

我已經使用下面的代碼行創建了套接字。 現在我改變我得到這樣的套接字的值套接字發送recv函數

m_Socket ++;

即使現在發送recv套接字函數成功,而不會拋出SOCKET_ERROR。 我期望它必須拋出錯誤。

我做錯了什麼。

struct sockaddr_in ServerSock; //綁定端口號套接字的地址結構,聽

char *localIP ; 

SOCKET SocServer; 

//To Set up the sockaddr structure 
ServerSock.sin_family = AF_INET; 
ServerSock.sin_addr.s_addr = INADDR_ANY; 

ServerSock.sin_port = htons(pLantronics->m_wRIPortNo); 

// To Create a socket for listening on wPortNumber 
if((SocServer = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
{ 
    return FALSE; 
} 

//To bind the socket with wPortNumber 
if(bind(SocServer,(sockaddr*)&ServerSock,sizeof(ServerSock))!=0) 
{ 
    return FALSE; 
} 

// To Listen for the connection on wPortNumber 
if(listen(SocServer,SOMAXCONN)!=0) 
{ 
    return FALSE; 
} 

// Structure to get the IP Address of the connecting Entity 
sockaddr_in insock; 

int insocklen=sizeof(insock); 

//To accept the Incoming connection on the wPortNumber 
pLantronics->m_Socket=accept(SocServer,(struct sockaddr*)&insock,&insocklen); 

if(pLantronics->m_Socket == INVALID_SOCKET) 
{ 
    shutdown(SocServer, 2); 
    closesocket(SocServer); 
    return FALSE; 
} 

// To make socket non-blocking 
DWORD dwNonBlocking = 1; 
if(ioctlsocket(pLantronics->m_Socket, FIONBIO, &dwNonBlocking)) 
{ 
    shutdown(pLantronics->m_Socket, 2); 
    closesocket(pLantronics->m_Socket); 
    return FALSE; 
} 


pLantronics->m_sModemName = inet_ntoa(insock.sin_addr); 

我現在

m_Socket++;//change to some other number ideally expecting send recv to fail. 

即使現在發送的recv socket函數不拋出SOCKET_ERROR成功。 我期望它必須拋出錯誤。

我做錯了什麼。

+0

你爲什麼要在++上套接字值?這完全是無意義的。這個問題的目的是什麼? – INS 2010-06-16 09:51:35

+0

你在哪個平臺上?在visual studio 2008中調用m_Socket ++,然後用m_Socket做任何事情都會導致錯誤。另外,盧連說,爲什麼? – 2010-06-16 11:36:44

回答

13

這是因爲Windows句柄的獨特性 - 創建它們時,它們可以被4整除,並且在使用時,它們的兩個最低位被忽略。將句柄遞增1會使得m_Socket與之前一樣引用相同的套接字(只有當您遞增4時,該函數纔會返回錯誤 - 除非有另一個打開該值的句柄)。

您不應該以這種方式探測打開的手柄。雖然有其他方法可以枚舉打開的句柄,但不應該使用它們。不要依靠系統來跟蹤你的手柄 - 自己跟蹤它們。

+0

很高興知道,我不知道。但仍然:爲什麼你會增加*套接字值*? – INS 2010-06-16 09:57:50

+0

@IulianŞerbănoiu,你不會的。 – avakar 2010-06-16 10:01:21

+2

這是很好的答案。我不知道這種情況。 – ckv 2010-06-16 10:04:50