2010-06-16 49 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