Здравствуйте, __boolean, Вы писали:
__>
__>Во-первых, если порт уже занят, то почему-то getsockname не возвращает новый порт. Говорит 0.
__>[ccode]
__>getsockname(hSocket, (SOCKADDR*)&tcpaddr, &nLen);
__>nPort = ntohs(tcpaddr.sin_port);
__>
Не работает потому, что 3-й параметр функции getsockname имеет тип "значение-результат".Инициализируй его длиной структуры tcpaddr и будет тебе счастье.
__>Во-вторых, когда происходит 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);
__> }
__>
10022, как нетрудно убедиться, означает недопустимый аргумент. Поскольку в данном коде не видно, что хранят переменные hWnd, nEvent и что означает константа WM_SOCK_NETEVENT, то ничего определенного сказать нельзя. Скажу лишь, что набросал подобный код и у меня все работает.