Клиент C++ не может отправить на сервер / Winsock

Я работаю над усовершенствованной программой клиент-сервер, где я отправляю коды джойстика (нажатые кнопки) на сервер. Поскольку я отправляю более одного кода джойстика, в одном отрывке моего кода 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;
    }

Как вы заметили, сегмент клиентского кода не включает функцию send. Это потому, что, как я уже сказал, я не всегда посылаю одну и ту же переменную 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. Почему это происходит? Любая помощь будет оценена.

1 ответ

Решение

Трудно сказать из вашего кода, но кажется, int client() предполагается, что это какая-то функция инициации соединения с вашим сервером, а затем вы вызываете send, но твой SOCKET ConnectSocket; является локальным для client()... у вас также есть глобальное объявление дескриптора сокета? Возможно, вы хотели вернуться ConnectSocket от client()? Кроме того, я настоятельно рекомендую не нажимать кнопку для подключения. Я бы порекомендовал одно постоянное соединение, то есть подключиться один раз, и после этого отправлять по мере необходимости.

Другие вопросы по тегам