2015-07-06 61 views
0

我正在寫在C socket編程代碼,我運行的客戶端,並在同一個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)線,在這種情況下我正確收到的按摩server.does任何人有任何想法這個代碼有什麼問題?

+2

你考慮過查找Winsock錯誤10054嗎? – EJP

+0

請注意,如果您的小緩衝區被recv()調用完全填充,'test [receive_size] ='\ 0';'將超出界限:( –

回答

3

您的客戶端正在發送數據,該數據將數據放入IP堆棧進行發送。然後立即終止,這意味着IP堆棧將取消發送並且不正常地關閉套接字。

在終止客戶端之前,您需要shutdownclosesocket套接字。

+0

如果關閉套接字,則不需要關閉,除非套接字已被繼承,並且您希望它現在肯定關閉。 – EJP