2013-10-16 409 views
0

我正在開發一個高級客戶端服務器程序,在那裏我將一個手柄的代碼(已按下的按鈕)發送到服務器。由於我發送了多個遊戲手柄代碼,因此在我的一段C++代碼中,我必須重複客戶端代碼段。C++客戶端無法發送到服務器/ Winsock

我想每次有東西要發送時調用一個函數。

客戶funcion:

int client() 
{ 
    // Initialize Winsock. 
    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != NO_ERROR) { 
     MessageBox(NULL, TEXT("Winsock initialization, done unsuccessfully"), TEXT("Diploma thesis"), MB_ICONERROR | MB_OK); 
     return 1; 
    } 

    // Create a socket for connecting to server. 
    SOCKET ConnectSocket; 
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (ConnectSocket == INVALID_SOCKET) { 
     MessageBox(NULL, TEXT("Socket creation for connecting to server, done unsuccessfully"), TEXT("Diploma thesis"), MB_ICONERROR | MB_OK); 
     WSACleanup(); 
     return 1; 
    } 

    // 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(5004); 

    // Connect to server. 
    iResult = connect(ConnectSocket, (SOCKADDR *) &Service, sizeof (Service)); 
    if (iResult == SOCKET_ERROR) { 
     iResult = closesocket(ConnectSocket); 
     MessageBox(NULL, TEXT("Connection with server, done unsuccessfully"), TEXT("Diploma thesis"), MB_ICONERROR | MB_OK); 
     WSACleanup(); 
     return 1; 
    } 

如您所知,客戶端代碼段,不包括髮送功能。這是因爲,正如我所說的,我並不總是發送相同的char變量。根據已按下的按鈕,將發送不同的字符。例如:

代碼段(發送Δ和O鍵):

client(); 
if (send(ConnectSocket, c_szText1, sizeof(c_szText1), 0) == SOCKET_ERROR) 
    {MessageBox(NULL, TEXT("The message could not be sent"), TEXT("Diploma thesis"), MB_ICONERROR | MB_OK);} 
} 
client(); 
if (send(ConnectSocket, c_szText2, sizeof(c_szText2), 0) == SOCKET_ERROR) 
    {MessageBox(NULL, TEXT("The message could not be sent"), TEXT("Diploma thesis"), MB_ICONERROR | MB_OK);} 
    } 

然而,發送函數失敗SOCKET_ERROR。爲什麼會發生?任何幫助,將不勝感激。

+0

使用WSAGetLastError獲取有關套接字錯誤的更多信息。如何聲明c_szText1和c_szText2? –

+0

由於客戶端是一個Windows應用程序,我不知道我是否可以將WSAGetLastError嵌入到MessageBox中。我會尋找它。 c_szText1和c_szText2被聲明爲char。 – dempap

回答

0

很難從你的代碼告訴,但它似乎像int client()應該是某種聯繫,起始功能到您的服務器,然後調用send,但你的SOCKET ConnectSocket;是本地client() ......你是否也有全局聲明的套接字句柄?也許你打算從client()返回ConnectSocket?另外,我強烈建議不要按每個按鈕進行連接。我建議一個單一的持續連接,即連接一次,然後在必要時發送。

+0

你的回答確實幫助我解決了這個問題。由於SOCKET ConnectSocket在客戶端()上是本地的,因此發送函數失敗,並且SOCKET_ERROR失敗。因此,我讓client()返回ConnectSocket,然後將該值傳遞給ConnectSocket2(ConnectSocket2 = client();),這就是我發送的內容。 – dempap

相關問題