У меня есть TCP-сервер и клиентские программы.Мой клиент отправляет сообщения на сервер, который передает сообщения обратно клиенту.
На моем сервере я хотел бы напечатать то, что получил, но перед этим я хотел бы показать IPи имя хоста клиента.Как бы я это сделал?
Я попробовал какой-то код, но, похоже, он не работает, IP отображается как "0.0.0.0"
.У меня была та же программа в UDP, и она работала нормально.
Кроме того, как мне напечатать имя хоста?Клиент / Сервер находится на той же машине.
Вот код моего сервера (интересная часть в конце):
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int listenSocket, status, socketClient;
unsigned short int msgLength;
struct addrinfo hints, *servinfo;
struct sockaddr_in clientAddress;
socklen_t clientAddressLength = sizeof clientAddress;
char msg[101]; //Chaque message fait 100 caractères ma
if ((listenSocket = socket(servinfo->ai_family, servinfo->ai_socktype,
servinfo->ai_protocol)) == -1) {
perror("socket:");
return 4;
if (listen(listenSocket, 5) != 0) {
printf("Erreur de listen : %s", strerror(errno));
exit(1);
}
int sizeOfSockAddr = sizeof(clientAddress);
socketClient= accept(listenSocket, NULL, NULL);
if (socketClient < 0) {
printf("error accept: %s\n",strerror(errno));
return 6;
}
// Libération de la mémoire occupée par les enregistrements
freeaddrinfo(servinfo);
printf("Attente de requête du client sur le port %s\n", argv[1]);
while (1) {
// Mise à zéro du tampon de façon à connaître le délimiteur de fin de chaîne.
memset(msg, 0, sizeof msg);
if (recv(socketClient, msg, sizeof msg, 0) == -1) {
perror("recv:");
close(listenSocket);
close(listenSocket);
return 7;
}
msgLength = strlen(msg);
if (msgLength > 0) {
printf(">> from %s", inet_ntoa(clientAddress.sin_addr));
printf(":%hu\n", ntohs(clientAddress.sin_port));
printf(" Message reçu : %s\n", msg);
}
}
}