Клиент Winsock IRC подключается, но не отправляет данные - PullRequest
1 голос
/ 28 ноября 2010

Я использую код, размещенный на http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/126639f1-487d-4755-af1b-cfb8bb64bdf8, но он не отправляет данные, как сказано в первом сообщении.Как мне использовать WSAGetLastError (), как сказано в решении, чтобы выяснить, в чем дело?

Я попробовал следующее:

  void IRC::SendBuf(char* sendbuf)

  {

      int senderror = send(m_socket, sendbuf, sizeof(sendbuf), MSG_OOB);      

     if(senderror == ERROR_SUCCESS) {
            printf("Client: The test string sent: \"%s\"\n", sendbuf);
     }
     else {
            cout << "error is: " << senderror << ", WSAGetLastError: " << WSAGetLastError() << endl;       
  printf("Client: The test string sent: \"%s\"\n", sendbuf);

  }
  }

И вывод: ошибка: 4, WSAGetLastError: 0

1 Ответ

0 голосов
/ 28 ноября 2010

Вы оцениваете адрес WSAGetLastError вместо его вызова.Вам нужно добавить круглые скобки для того, чтобы фактически вызвать эту функцию:

void IRC::SendBuf(char* sendbuf)
{
    int senderror = send(m_socket, sendbuf, strlen(sendbuf), 0);
    if (senderror != SOCKET_ERROR) {
        printf("Client: The test string sent: \"%s\"\n", sendbuf);
    } else {
        cout << "Error is: " << WSAGetLastError() << endl;
    }
}

EDIT: Функция send () возвращает количество записанных байтов, а некод ошибки.Вам необходимо проверить возвращаемое значение по SOCKET_ERROR, как в обновленном коде выше.В вашем случае send() говорит, что он успешно отправил 4 байта.

Как вы заметили ниже, он отправляет только 4 байта, потому что это размер переменной sendbuf (это указатель, а не буфер),Если строка в sendbuf оканчивается нулем, вы можете использовать strlen().Если это не так, вам, вероятно, следует добавить параметр длины строки к самому IRC::SendBuf().

...