TCP recvfrom () не хранит 'from'

Я делаю серверную программу с использованием TCP и хочу получить IP-адрес отправителя только что полученного сообщения. Вот мой код:

case FD_READ:
{    //Incoming data; get ready to receive
    char buffer[DEFAULT_BUFLEN];
    int bytes_received; 
    memset(buffer, '\0', sizeof(buffer));

    struct sockaddr_in recvIn;
    int recv_length = sizeof(struct sockaddr);

    memset((void *)&recvIn, '\0', recv_length);

    bytes_received = recvfrom(wParam, buffer, DEFAULT_BUFLEN, 0, (struct sockaddr *)&recvIn, &recv_length);
    cout << inet_ntoa(recvIn.sin_addr) << "\n";

    break;
}

Поэтому я использую сообщения Windows, чтобы проверить, нужно ли мне проверять пакеты. Получение данных работает, я могу прочитать это и все. Но переменная recvIn не изменяется с помощью recvfrom. Поэтому, когда я делаю cout << inet_ntoa (recvIn.sin_addr) << "\ n", он пишет "0.0.0.0". Я погуглил эту проблему, и большинство других людей, у которых была эта проблема, забыли инициализировать recv_length. Но я почти уверен, что сделал это правильно здесь. Кто-нибудь может увидеть, что я делаю не так? Или мне нужно что-то изменить с отправляемыми данными? Возможно, входящие данные не имеют IP-адреса. В этом я очень сомневаюсь, потому что я использую TCP.

Спасибо за ваше время, я надеюсь, я смогу решить эту проблему!

 Maxim Schoemaker13 окт. 2012 г., 15:33
Но когда несколько человек подключаются к моему серверу (что и должно происходить), как узнать, какие данные соответствуют какому клиенту?
 Mat13 окт. 2012 г., 15:29
struct sockaddr_in recvIn; int recv_length = sizeof(struct sockaddr); подозрительно: вы не обращаетесьsizeof к типу структуры, которую вы передаете. Вы пробовали код ближе к примеру в документации? (msdn.microsoft.com/en-us/library/windows/desktop/...)?
 Maxim Schoemaker13 окт. 2012 г., 15:20
Также мне было интересно, почему fromlen (последний параметр recvfrom) должен быть указателем, а не просто самим числом? Это кажется бессмысленным.
 Maxim Schoemaker13 окт. 2012 г., 15:32
@ JoãoMendes да, это сокет на основе соединения (это TCP), так что это должно быть! Спасибо
 João Mendes13 окт. 2012 г., 15:26
Это должен быть указатель, потому что эти API были написаны с учетом будущего расширения. Вы можете дать ему некоторый не дескрипторный буфер и передать его длину, и он заполнит буфер до текущего размера структуры и заполнит указатель длины фактической используемой длиной.

Ответы на вопрос(2)

Решение Вопроса

from а такжеfromlen предназначены для использования с протоколами без установления соединения, такими как UDP. Согласнодокументация, recvfrom игнорируемыхfrom а такжеfromlen для соединительных розеток.

getpeername () получить адрес удаленного сокета.

 João Mendes13 окт. 2012 г., 15:36
Чтобы дополнить ответ, ссылка на документацию MSDN для функции здесь:msdn.microsoft.com/en-us/library/windows/desktop/...
 Maxim Schoemaker13 окт. 2012 г., 15:38
Большое спасибо! ^^ это как раз то, что мне было нужно: D

Ваш ответ на вопрос