UDP bind給出的錯誤提示10022
sock為類成員變數
port也為類成員變數
(一些錯誤校驗都省略了)
第一個版本:
bool InitSocket()
{
sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN sockSrc;
sockSrc.sin_family = AF_INET;
sockSrc.sin_port = htons(port);
sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int times = 0;
while(times < 1000000 && SOCKET_ERROR == bind(sock, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR)))
{
qDebug("CanThread: Bind socket error! Reason %d", WSAGetLastError());
times++;
Sleep(200);
}
}
繫結說明:對於繫結經常會給出10048錯誤提示,在此時的情況下,出現10048的原因是在釋放socket資源後系統沒有真正的立即釋放掉,此時繫結就會出現10048這個錯誤。系統真正的釋放時間應該在2~4分鐘。
第二個版本:
typedef sturct tag_UDP_SOCKET_PORT
{
SOCKET sock;
int port;
}UDP_SOCKET_PORT;
DWORD WINAPI bindUDPThread(LPVOID lpParam)
{
UDP_SOCKET_PORT *usp = (UDP_SOCKET_PORT*)lpParam;
SOCKADDR_IN sockSrc;
sockSrc.sin_family = AF_INET;
sockSrc.sin_port = htons(usp->port);
sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int Ret;
while(1)
{
Ret = bind(usp->sock, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR));
if(SOCKET_ERROR == Ret)
{
int tmpRet = WSAGetLastError();
qDebug("Bind Socket Error!Reason:%d,port = %d",WSAGetLastError(),port);
}
else
{
break;
}
Sleep(2000);
}
delte lpParam;
return 0;
}
bool InitSocket()
{
sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN sockSrc;
sockSrc.sin_family = AF_INET;
sockSrc.sin_port = htons(port);
sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int times = 0;
while(times < 10 && SOCKET_ERROR == bind(sock, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR)))
{
qDebug("CanThread: Bind socket error! Reason %d", WSAGetLastError());
times++;
Sleep(200);
}
if(times >= 10)
{
//當十次沒有繫結成功的話,就開啟一個執行緒專門用於繫結
UDP_SOCKET_PORT *usp = new UDP_SOCKET_PORT;
usp->sock = sock;
usp->port = port;
CreateThread(NULL,0,bindUDPThread,usp,NULL,NULL);
}
}
疑問:
第一個版本中輸出的錯誤提示總是10048
第二個版本中,新建的執行緒卻給出10022,搞不懂。。。