2013-10-16 88 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

相关问题