【发布时间】:2019-03-18 04:04:52
【问题描述】:
我有 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);
}
}
}
【问题讨论】:
-
这里有 2 个问题 ` printf(">> from %s", inet_ntoa(clientAddress.sin_addr));` 你还没有对 clientAddress 做任何事情,sin_addr 不是字符串
-
是的,现在很好,我更正了!我现在想知道如何在 getnameinfo 函数之后打印主机名
-
getnameinfo 应该已经为您将名称加载到字符串中,打印它