подскажите пожалуйста, что я делаю не правильно
для примера вырезал
....
WSADATA WsaData;
WORD wVers = MAKEWORD( 2, 0 );
INT nError = WSAStartup(wVers, &WsaData);
if(nError) return FALSE;
if(LOBYTE( WsaData.wVersion ) != 2 || HIBYTE( WsaData.wVersion ) != 0 ){
MessageBox(NULL, "Версия winsock не должна быть ниже 2.0", "Внимание", MB_OK|MB_ICONWARNING);
WSACleanup();
return FALSE;
}
CHAR szBuf[64];
INT nPort = 5555;
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN tcpaddr;
tcpaddr.sin_family = AF_INET;
tcpaddr.sin_port = htons((short)nPort);
tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(hSocket, (SOCKADDR*)&tcpaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
if(WSAGetLastError() == WSAEADDRINUSE){
//пусть выбирает порт сам
tcpaddr.sin_port = 0;
if(bind(hSocket, (SOCKADDR*)&tcpaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR){
sprintf(szBuf, "WinSocket.dll. bind %d", WSAGetLastError());
MessageBox(NULL, szBuf, "Внимание", MB_OK|MB_ICONERROR);
}
else{
INT nLen;
getsockname(hSocket, (SOCKADDR*)&tcpaddr, &nLen);
nPort = ntohs(tcpaddr.sin_port);
sprintf(szBuf, "WinSocket.dll. Порт по умолчанию занят, новый порт %d", nPort);
MessageBox(NULL, szBuf, "Внимание", MB_OK|MB_ICONWARNING);
}
}
if(listen(hSocket, 32) == SOCKET_ERROR){
sprintf(szBuf, "WinSocket.dll. listen %d", WSAGetLastError());
MessageBox(NULL, szBuf, "Внимание", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
Во-первых, если порт уже занят, то почему-то getsockname не возвращает новый порт. Говорит 0.
getsockname(hSocket, (SOCKADDR*)&tcpaddr, &nLen);
nPort = ntohs(tcpaddr.sin_port);
Во-вторых, когда происходит accept, при вызове WSAAsyncSelect, выдается ошибка 10022(WSAEINVAL)
SOCKADDR_IN saddr;
INT nsaddr = sizeof(SOCKADDR_IN);
SOCKET hAcceptSocket = accept(hSocket,(SOCKADDR*)&saddr, &nsaddr);
if(hAcceptSocket != INVALID_SOCKET)
if(WSAAsyncSelect(hAcceptSocket , hWnd, WM_SOCK_NETEVENT, nEvent) == SOCKET_ERROR){
char szBuf[64];
sprintf(szBuf, "WinSocket.dll. WSAAsyncSelect %d", WSAGetLastError());
MessageBox(NULL, szBuf, "Внимание", MB_OK|MB_ICONERROR);
}
уже голову сломал, не могу понять где у меня баги.
Заранее спасибо