【问题标题】:C++ client fails to send to server / WinsockC++ 客户端无法发送到服务器/Winsock
【发布时间】:2013-10-16 13:33:10
【问题描述】:

我正在开发一个高级客户端-服务器程序,我将游戏手柄的代码(已按下的按钮)发送到服务器。由于我发送了不止一个手柄代码,在我的一段 C++ 代码中,我不得不重复客户端代码段。

我想每次有东西要发送时调用一个函数。

客户端功能:

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。为什么会这样?任何帮助将不胜感激。

【问题讨论】:

  • 使用 WSAGetLastError 获取有关套接字错误的更多信息。 c_szText1 和 c_szText2 是如何声明的?
  • 由于客户端是windows应用程序,不知道能否将WSAGetLastError嵌入MessageBox。我会寻找它。 c_szText1 和 c_szText2 被声明为 char。

标签: c++ client-server winsock2 winsockets


【解决方案1】:

很难从您的代码中看出,但似乎int client() 应该是您服务器的某种连接初始化函数,然后您调用send,但您的SOCKET ConnectSocket;client() 的本地函数。 ..你也有套接字句柄的全局声明吗?也许您打算从client() 返回ConnectSocket?另外,我强烈建议不要按按钮连接。我建议使用单一的持久连接,即连接一次,然后根据需要进行发送。

【讨论】:

  • 您的回答确实帮我解决了问题。发送函数因 SOCKET_ERROR 失败,因为 SOCKET ConnectSocket 对 client() 是本地的。因此,我让 client() 返回 ConnectSocket,然后将该值传递给 ConnectSocket2 (ConnectSocket2 = client();),这就是我发送的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多