2012-03-16 5 views
0
CSocket listSock,lisRecvSock; 

if(!listSock.Create(pwd->m_ServerPort))//sometimes i got a CResourceException,why? 
{ 
    pwd->GetSocketError(); 
    return -1; 
}  
if(!lisRecvSock.Create(pwd->m_ServerPortRecv)) 
{ 
    pwd->GetSocketError(); 
    return -1; 
} 

lisRecvSock.Listen(3); 
listSock.Listen(3); 
//and the Accept sometimes return WSAEINVAL,accordingto msdn,I should Bind the socket 
//to a specific port and IP address,but the CSocket would Bind when Create  invoked,isn't it? 
if(!listSock.Accept(pwd->SendSock)) 
{ 
    pwd->GetSocketError(); 
    return -1; 
} 

왜 Create()가 호출되고 WSAEINVAL이 다시 실행될 때 CResourceException이 발생합니까? Accept WSAEINVAL을 msdn에 따라 반환해야합니다. 특정 포트와 IP 주소로 을 바인드해야하지만 CSocket은 Create가 호출 될 때 바인드하지 않습니까?CSocket 개체를 만들지 못했습니다.

답변

0

대답은 아마도 Socket.Create()가 스레드로부터 안전하지 않기 때문일 수 있습니다.
그래서 하나 이상의 스레드에서 소켓을 생성하면 예외가 발생할 수 있습니다.
Mutex를 사용하여 Socket.Create()에 대한 호출을 보호하십시오. 이 예는 다음에서 찾을 수 있습니다.
http://www.codeproject.com/Articles/7953/Thread-Synchronization-for-Beginners

관련 문제