2010-11-22 4 views
0

Ive записал и скомпилировал серверную программу, предназначенную для эха на экране, независимо от того, в чем работает клиентское приложение, код выглядит следующим образом.Устранение неисправностей сервера winsock

/*Server */ 
#define _WIN32_WINNT 0x501 
#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
using namespace std; 

const int winsock_version = 2; 
#define PORT "3490" 
#define MAX_NUM_CONNECTIONS 10 

int main(void){ 

    WSADATA wsadata; 

    if (WSAStartup(MAKEWORD(winsock_version,0),&wsadata) == 0){ 
     cout<<"-WSAStartup Initialized." << endl; 

     struct addrinfo hints,*res; 
     int sock_fd; 

     memset(&hints,0,sizeof hints); 
     hints.ai_family = AF_UNSPEC; 
     hints.ai_socktype = SOCK_STREAM; 
     hints.ai_flags = AI_PASSIVE; 

     if (getaddrinfo(NULL,PORT,&hints,&res) != 0){ 
      cout<<"-Call to getaddress was unsucceful." << endl; 
     } 

     if((sock_fd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1){ 
      cout<<"-Unable to Create socket." << endl; 
     } 

     if ((bind(sock_fd, res->ai_addr, res->ai_addrlen)) != -1){ 
      cout<<"-binding successful." << endl; 
     } 

     if ((listen(sock_fd,MAX_NUM_CONNECTIONS)) != -1){ 
      cout<<"-Listening for incoming connections." << endl; 
     } 
     //------------------------------------------------------------- 

     struct sockaddr_storage incming_info; 
     socklen_t sin_size; 
     sin_size = sizeof incming_info; 

     int new_fd; 

     new_fd = accept(sock_fd, (struct sockaddr*)&incming_info,&sin_size); 
     if (new_fd == -1){ 
      cout<<"-Accepting error." << endl; 
     } 
     if(new_fd == INVALID_SOCKET){ 
      cout<<"-INVALID SOCKET ERROR." << endl; 
     } 
     closesocket(new_fd); 
     //------------------------------------------------------------- 

     cout<<"Connected?" << endl; 

     while(true){ 
      int ret_val; 
      char buffer[128]; 
      ret_val = recv(new_fd,buffer,sizeof(buffer),0); 
      if(ret_val == -1){ 
       cout<<"Receiving Error." << endl; 
       break; 
      }else if(ret_val == 0){ 
       cout<<"Connection has been closed!." << endl; 
       break; 
      }else{ 
       cout<<"---Server Echoeing what was recieved from client---" << endl; 
       cout<<"Server: " << buffer << endl; 

      } 
      closesocket(new_fd); 
     } 
     cout<<"-Closing connection" << endl; 

    }else{ 
     cout<<"-WSAStartup Initialization failed." << endl; 
     if(WSACleanup()!=0){ 
      cout<<"-WSACleanup Successful." << endl; 
     }else{ 
      cout<<"-WSACleanup Failed." << endl; 
     } 
    } 
    return 0; 
} 

Все это компилируется и работает, однако, когда я пытаюсь использовать замазку и подключиться к порту на локальный сервер 3490 умирает и печатает «Получение ошибки». что вызывает эту проблему?

+0

Почему бы не позвонить WSAGetLastError() и узнать ... –

ответ

1

Сразу после принятия нового гнезда в new_fd вы вызываете на него closesocket (см. Ниже). Вы не должны этого делать, пока не закончите получать. Если вы хотите закрыть сокет прослушивателя в этот момент, вместо этого вы должны называть closesocket(sock_fd).

int new_fd; 

    new_fd = accept(sock_fd, (struct sockaddr*)&incming_info,&sin_size); 
    if (new_fd == -1){ 
     cout<<"-Accepting error." << endl; 
    } 
    if(new_fd == INVALID_SOCKET){ 
     cout<<"-INVALID SOCKET ERROR." << endl; 
    } 
    closesocket(new_fd); 
+0

Большое спасибо, сэр. – silent

+0

никаких проблем, @ Рекомендация Len для проверки и вывода/журнала ** все ** ошибки также уместны, особенно по мере того, как ваш код становится более сложным. –

Смежные вопросы