|
|
От: |
butcher
|
http://bu7cher.blogspot.com |
| Дата: | 19.01.04 12:56 | ||
| Оценка: | |||
__> ....
__> 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;
__>почитай тут, может что и поможет: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.