2013-10-16 4 views
0

Я работаю над усовершенствованной клиент-серверной программой, где я отправляю коды джойстика (кнопки, которые были нажаты) на сервер. Поскольку я посылаю несколько кодов джойстика, в одном отрывке моего кода на C++ мне нужно повторить сегмент кода клиента.Клиент C++ не отправляет на сервер/Winsock

Я думал о вызове функции каждый раз, когда мне есть что отправить.

клиент несильно:

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() ... Вы также есть глобальная декларация дескриптора сокета? Возможно, вы хотели вернуть ConnectSocket от client()? Кроме того, я настоятельно рекомендую использовать соединение для нажатия кнопки. Я бы рекомендовал одно постоянное соединение, то есть, подключиться один раз и после этого отправить по необходимости.

+0

Ваш ответ действительно помог мне решить проблему. Ошибка отправки функции SOCKET_ERROR, так как SOCKET ConnectSocket был локальным для клиента(). Поэтому я сделал client() для возврата ConnectSocket, а затем передал это значение ConnectSocket2 (ConnectSocket2 = client();), которое я отправляю. – dempap

Смежные вопросы