2015-07-06 3 views
0

Я пишу код сокет программирования на C, и я бегу клиент и сервер на том же computer.here код для сервераОшибка 10054 в сокет программирования

int main() 
{ 
    WSADATA wsa; 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
     cout << "WSAStartup failed!" << endl; 
     return -1; 
    } 

    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (sock == INVALID_SOCKET) 
    { 
     cout << "socket failed with error:" << WSAGetLastError() << endl; 

     WSACleanup(); 
     return -1; 
    } 

    struct sockaddr_in service; 
    service.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    service.sin_family = AF_INET; 
    service.sin_port = htons(5059); 

    if (bind(sock, (SOCKADDR *)&service, sizeof(service)) == SOCKET_ERROR) 
    { 
     cout << "bind failed with error:" << WSAGetLastError() << endl; 

     closesocket(sock); 
     WSACleanup(); 
     return -1; 
    } 

    if (listen(sock, 5) == SOCKET_ERROR) 
    { 
     cout << "listen failed with error:" << WSAGetLastError() << endl; 

     closesocket(sock); 
     WSACleanup(); 
     return -1; 
    } 
    while (true) 
    { 
     cout << "Waiting for a PKCS11 client ..." << endl; 

     SOCKET accsock = accept(sock, NULL, NULL); 
     if (accsock == INVALID_SOCKET) 
     { 
      cout << "accept failed with error:" << WSAGetLastError() << endl; 

      closesocket(sock); 
      WSACleanup(); 
      return -1; 
     } 

     cout << "PKCS11 client connected ..." << endl; 

     while (true) 
     { 
      int receive_size = 0; 
      char test[20]; 
      receive_size = recv(accsock, test, 20, 0); 
      if (receive_size == SOCKET_ERROR) 
      { 
       cout << endl << "ERROR : "<<WSAGetLastError() << " PKCS11 client disconnected." << endl; 
       closesocket(accsock); 
       break; 
      } 

      test[receive_size] = '\0'; 
      command = temp; 
      printf("recieved value is : %s\n",test); 
      } 
      } 

и вот код клиента

int main(){ 
    /*CK_SESSION_HANDLE hSession = NULL; 
    CK_MECHANISM_PTR pMechanism = NULL; 
    CK_OBJECT_HANDLE hKey = NULL; 
    C_EncryptInit(hSession, pMechanism, hKey);*/ 

    char temp[10]; 
    printf("initialising ... \n"); 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
     printf("Error = :%d", WSAGetLastError()); 
     WSACleanup(); 
     return -1; 
    } 
    printf("initialised\n"); 
    //create a socket 
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
    { 
     printf("Could not create socket : %d", WSAGetLastError()); 
     WSACleanup(); 
     return -1; 
    } 

    printf("Socket created.\n"); 


    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(5059); 

    //Connect to remote server 
    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0) 
    { 
     puts("connect error"); 
     return 1; 
    } 

    puts("Connected"); 


    _itoa(CK_ENCRYPT, temp, 16); 
    command = temp; 
    int counter = 0; 
    char* test = "H"; 
    while (counter != strlen(test)) { 
    counter += send(s, test, strlen(test), 0); 
    cout << counter << endl; 
} 


    //while (1); 
    return 0; 
} 

проблема заключается в том, что, когда я пытаюсь отправить более одного байта от клиента к серверу я получаю 10054 Ошибка, если я не раскомментировать то время как (1) линии, которая в этом случае я получаю массаж правильно в сервер. Кто-нибудь есть какая-то идея, что не так с этим кодом?

+2

Вы считаете, что ищете Winsock error 10054? – EJP

+0

Обратите внимание, что если ваш маленький буфер полностью заполнен вызовом recv(), 'test [receive_size] =' \ 0 ';' будет вне пределов :( –

ответ

3

Ваш клиент отправляет данные, которые помещают данные в стек IP для отправки. Затем сразу же завершается, что означает, что IP-стек отменит отправку и неадекватно закрывает сокет.

Необходимо до shutdown и closesocket разъема до его завершения.

+0

Если вы закрываете сокет, вам не нужно выключать, за исключением случая, когда сокет был унаследован, и вы хотите, чтобы он определенно закрылся. – EJP

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