Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
писал клиент-сервер. дома на тестовой машине пахало на ура.
была сеть из двух машин с IP 192.168.0.1 и 192.168.0.2 принес проект на работу и вот такая хрень. 10038 ошибка. кек лечить не пойму. а на работе все машины с внешними IP. клиент: char ip_address[256]; sprintf(ip_address, "%d.%d.%d.%d", adr[0], adr[1], adr[2], adr[3]); int port = 2106; BOOL res = pConnect->Connect(ip_address, port); server: for(;;) { fd_set readset; FD_ZERO( &readset ); FD_SET( login_socket, &readset ); FD_SET( game_socket, &readset ); for( int it = 0; it < clients.GetSize(); it++) FD_SET( clients.GetAt(it)->GetSocket(), &readset ); timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 1; int mx = getmax( max( login_socket, game_socket ) ); if( FD_ISSET( login_socket, &readset ) ) { //this is new connect // sockaddr_in login_name; int client_sock = accept( login_socket, 0, 0 ); if( client_sock < 0 ) { printfex(RED, "error: accept() \n"); exit(); closesocket( login_socket ); closesocket( game_socket ); return 1; } // fcntl( client_sock, F_SETFL, O_NONBLOCK ); CClient* pClient = new CClient; pClient->SetSocket( client_sock ); pClient->port = 2106; clients.add( pClient ); if( -1 == m_Login->OnConnect(pClient) ) { printfex(RED, "[L2 Serever] fatal connect to 2106\n"); remove( pClient ); } else printfex(YELLOW, "[L2 Serever] connect to 2106\n"); } } Добавлено ЗЫ, пытался отрубить тачку от сети и поставить на ней "домашние" IP - один хрен не пашет. Добавлено млин, WSADATA WSAData ; if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) { // ::MessageBox (NULL, TEXT("WSAStartup failed!"), TEXT("Error"), MB_OK); return; } char ip_address[256]; sprintf(ip_address, "%d.%d.%d.%d", adr[0], adr[1], adr[2], adr[3]); int port = 2106; BOOL res = pConnect->Connect(ip_address, port); однако WSADATA WSAData ; if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) { // ::MessageBox (NULL, TEXT("WSAStartup failed!"), TEXT("Error"), MB_OK); return; } вызывалось при старте программы. чудеса однако. |
Сообщ.
#2
,
|
|
|
progman
Так а где - после какой функции - эта ошибка вылазит??? WSAENOTSOCK (10038) Socket operation on non-socket. Berkeley description: An operation was attempted on something that is not a socket. The specified socket parameter refers to a file, not a socket. WinSock description: Same as Berkeley. The socket input parameter is not a valid socket handle (either it never was valid, it's a file handle (not a socket handle), or if it was a socket handle, it has been closed). Detailed description: select(): fails with WSAENOTSOCK if any socket in an fd_set is an invalid socket handle. Developer suggestions: Did you close a socket inadvertently in one part of an application without keeping another part notified? Use socket state in an application and/or handle this error gracefully as a non-fatal error. WinSock functions: Any function that takes a socket as an input parameter: accept(), bind(), closesocket(), connect(), getpeername(), getsockname(), getsockopt(), ioctl socket(), listen(), recv(), recvfrom(), select(), send(), sendto(), setsockopt(), shutdown(), FD_CONNECT Additional functions: WSAAsyncSelect() should be in the list of functions (some applications might not register for or handle the FD_CONNECT message). |
Сообщ.
#3
,
|
|
|
Oleg2004
вылезала сразу после BOOL res = pConnect->Connect(ip_address, port); клиентский сокет не мог законнекится на серверный. в инициализации окна стоял WSAStartup , очевидно не хватило одного вызова . поставил WSAStartup перед коннектом и заработало. |
Сообщ.
#4
,
|
|
|
progman
Цитата поставил WSAStartup перед коннектом и заработало. Это виндовский закон - в любой сетевой программе надо инициализировать Winsock и затем в конце освободить все сетевые ресурсы - WSAСleanup |