Re: TCP/IP ошибка инициализации
От: butcher Россия http://bu7cher.blogspot.com
Дата: 19.01.04 12:56
Оценка:
Здравствуйте, __boolean, Вы писали:

__>
__>        ....

__>    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;
__>    }
// Этот код, ИМХО, не нужен, если ошибка будет, до сюда не дойдёт, если не будет, то эта проверка не нужна 
__>    if(bind(hSocket, (SOCKADDR*)&tcpaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
// Здесь лучше вывести код ошибки а не то что следует далее
__>        if(WSAGetLastError() == WSAEADDRINUSE){ // если порт занят, то можно установить SO_REUSEADDR
__>        //пусть выбирает порт сам
__>            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);                
__>            }
/* Можешь объяснить назначение этого кода? почитай про getsockname повнимательнее, ИМХО, у неё другое назначение, 
и в данном контексте её вызов некорректен */
__>        }
__>    if(listen(hSocket, 32) == SOCKET_ERROR){
__>        sprintf(szBuf, "WinSocket.dll. listen %d", WSAGetLastError());
__>        MessageBox(NULL, szBuf, "Внимание", MB_OK|MB_ICONWARNING);                
__>                return FALSE;  
__>    }
__>        return TRUE;
__>


__>Во-вторых, когда происходит accept, при вызове WSAAsyncSelect, выдается ошибка 10022(WSAEINVAL)

WSAEINVAL Indicates that one of the specified parameters was invalid such as the window handle not referring to an existing window, or the specified socket is in an invalid state.

почитай тут, может что и поможет:

Нет ничего невозможного..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.