TCP/IP ошибка инициализации
От: __boolean Россия  
Дата: 19.01.04 08:20
Оценка:
подскажите пожалуйста, что я делаю не правильно
для примера вырезал

        ....

    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);
                }


уже голову сломал, не могу понять где у меня баги.
Заранее спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.