2013-10-04 6 views
0

간단한 클라이언트 - 서버 응용 프로그램에서 작업하고 있습니다. 그러나 클라이언트가 실행 된 후 서버 쪽에서 recv()를 사용하여 메시지 오류 10038이 발생합니다. 소켓 번호 설명자는 클라이언트와 서버 모두에서 동일한 값을 유지하므로 소켓 오류가 없다고 생각합니다. 어떤 도움을 주시면 감사하겠습니다.C++ 서버가 클라이언트/Winsock에서 데이터를 수신 할 수 없습니다.

클라이언트 :

#ifndef UNICODE 
#define UNICODE 
#endif 

#define WIN32_LEAN_AND_MEAN 

#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 

// Need to link with Ws2_32.lib. 
#pragma comment(lib, "ws2_32.lib") 

int wmain() 
{ 
    // Initialize Winsock. 
    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != NO_ERROR) { 
     printf("WSAStartup() failed with error: %d\n", iResult); 
     return 1; 
    } 

    // Create a socket for connecting to server. 
    SOCKET ConnectSocket; 
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (ConnectSocket == INVALID_SOCKET) { 
     printf("socket() failed with error: %ld\n", WSAGetLastError()); 
     WSACleanup(); 
     return 1; 
    } 
    printf("Socket descriptor: %d\n",ConnectSocket); 

    // The sockaddr_in structure specifies the address family, 
    // IP address, and port of the server to be connected to. 
    sockaddr_in Service; 
    memset(&Service, 0, sizeof(Service)); 
    Service.sin_family = AF_INET; 
    Service.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    Service.sin_port = htons(27015); 

    // Connect to server. 
    iResult = connect(ConnectSocket, (SOCKADDR *) &Service, sizeof (Service)); 
    if (iResult == SOCKET_ERROR) { 
     printf("connect() failed with error: %ld\n", WSAGetLastError()); 
     iResult = closesocket(ConnectSocket); 
     if (iResult == SOCKET_ERROR) 
      printf("closesocket() failed with error: %ld\n", WSAGetLastError()); 
     WSACleanup(); 
     return 1; 
    } 
    printf("Connected to server.\n"); 

    // Message that has to be sent. 
    char receiveBuffer[1000]; 
    char message[1000]; 

    printf("\nEnter message: "); 
    gets_s(message); 

    printf("Message you wrote is: %s\n", message); 

    // Send a message. 
    if (send(ConnectSocket, message, sizeof(message), 0) == SOCKET_ERROR) 
    { 
     printf("send() failed with error code: %d\n", WSAGetLastError()); 
    } 

     printf("Message successfully sent to server."); 

    // Receive a message. 
    if (recv(ConnectSocket, receiveBuffer, 1000, 0) == SOCKET_ERROR) 
    { 
     printf("recv() failed with error code: %d\n", WSAGetLastError()); 
     while(1); 
    } 

    printf("\nServer says:"); 
    printf(receiveBuffer,sizeof(receiveBuffer)); 

    while(1); 

closesocket(ConnectSocket); 
WSACleanup(); 

return 0; 
} 

서버 :

#ifndef UNICODE 
#define UNICODE 
#endif 

#define WIN32_LEAN_AND_MEAN 

#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 

// Need to link with Ws2_32.lib 
#pragma comment(lib, "ws2_32.lib") 

int wmain() 
{ 
    // Initialize Winsock. 
    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != NO_ERROR) { 
     printf("WSAStartup() failed with error: %d\n", iResult); 
     return 1; 
    } 

    // Create a socket for connecting to client. 
    SOCKET ConnectSocket; 
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (ConnectSocket == INVALID_SOCKET) { 
     printf("socket() failed with error: %ld\n", WSAGetLastError()); 
     WSACleanup(); 
     return 1; 
    } 
    printf("Socket descriptor: %d\n", ConnectSocket); 

    // The sockaddr_in structure specifies the address family, 
    // IP address, and port of the server to be connected to. 
    sockaddr_in Service; 
    memset(&Service, 0, sizeof(Service)); 
    Service.sin_family = AF_INET; 
    Service.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    Service.sin_port = htons(27015); 

    //Bind. 
    if (bind(ConnectSocket, (struct sockaddr *)&Service, sizeof(Service)) == SOCKET_ERROR) 
    { 
     printf("Bind failed with error code: %d\n" , WSAGetLastError()); 
    } 
    printf("Bind done.\n"); 

    // Listen on the socket for a client. 
    if (listen(ConnectSocket, 1) == SOCKET_ERROR) 
    { 
     printf ("listen() failed with error: %ld\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 
    printf("listen() run successfully.\n"); 

    // Accept a connection from a client. 
    SOCKET acceptSocket; 
    acceptSocket = accept(ConnectSocket, NULL, NULL); 
    if (acceptSocket == INVALID_SOCKET) { 
     printf("accept() failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 
    else{ 
     printf("accept() run successfully.\n"); 
    } 

    // No longer need server socket. 
    closesocket(ConnectSocket); 

    char receiveBuffer[1000]; 
    int recv_len; 

    printf("\nWaiting for data...\n"); 
    fflush(stdout); 

    // Receive a message. 
    if (recv_len = recv(ConnectSocket, receiveBuffer, 1000, 0) == SOCKET_ERROR) 
    { 
     printf("Socket descriptor, after recv(): %d\n", ConnectSocket); 
     printf("recv() failed with error code: %d\n", WSAGetLastError()); 
     while(1); 
    } 
    // Send a message. 
    if (send(ConnectSocket, receiveBuffer, recv_len, 0) == SOCKET_ERROR) 
    { 
     printf("sendto() failed with error code: %d\n", WSAGetLastError()); 
     while(1); 
    } 
    else 
     printf("\nMessage sent back to client."); 
    while(1); 

closesocket(ConnectSocket); 
WSACleanup(); 

return 0; 
} 

내가 Winsock을 프로그래밍에서 초보자이고 어떤 도움을 주시면 감사하겠습니다.

답변

0

오류 10038은 WSAENOTSOCK입니다. 이는 유효한 소켓이 없음을 의미합니다. 서버 측에서는 서버 소켓을 닫은 후 서버 소켓 (ConnectSocket)을 사용하고 있습니다. 송수신하려면 연결된 소켓 (acceptSocket)을 대신 사용해야합니다. 또한 완료했을 때 acceptSocket을 종료해야하며 ConnectSocket 번을 다시 닫지 마십시오.