Я делаю серверную программу с использованием 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. Поэтому, когда я делаю кут << inet_ntoa (recvIn.sin_addr) << «\ n» пишет «0.0.0.0». Я погуглил эту проблему, и большинство других людей, у которых была эта проблема, забыли инициализировать recv_length. Но я почти уверен, что сделал это правильно здесь. Кто-нибудь может увидеть, что я делаю не так? Или мне нужно что-то изменить с отправляемыми данными? Возможно, входящие данные не имеют IP-адреса. В этом я очень сомневаюсь, потому что я использую TCP.
Спасибо за ваше время, я надеюсь, я смогу решить эту проблему!
TCP — это протокол, ориентированный на соединение. from
а также fromlen
предназначены для использования с протоколами без установления соединения, такими как UDP. Согласно документация, recvfrom
игнорируемых from
а также fromlen
для соединительных розеток.
Для подключенного сокета TCP вы должны использовать getpeername () получить адрес удаленного сокета.