gpt4 book ai didi

c - 如何在服务器端显示客户端IP地址?

转载 作者:太空宇宙 更新时间:2023-11-04 01:07:40 27 4
gpt4 key购买 nike

我的迷你项目是实现一个 c 套接字程序,多个客户端将文件发送到两个或三个服务器。我已经实现了这些。但是为了处理客户请求我需要创建一个子进程是吗?我怎样才能做到这一点 。就像必须单独处理请求一样。请有人指导我去做。

服务器:

int main()
{
int sockfd, new_sockfd,x1,x2,log,n;
int server_len, client_len,len;
int cont,fh,cont2;
int result1;
struct sockaddr_in serveraddress;
struct sockaddr_in address;
struct sockaddr_in client_address;

FILE *ia_address;
char *fname = "/home/shishira/Desktop/packet_capture/info_agent_report.txt";
int buffsize=1024;
char buffer1[1024];
char buffer[1024];
char clntName[INET_ADDRSTRLEN];

if((sockfd = socket(AF_INET,SOCK_STREAM,0))>0)
printf("\n Socket was created\n");

/* Name the socket. */

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = ntohs(9734);
server_len = sizeof(address);
bind(sockfd, (struct sockaddr *)&address, server_len);

/* Create a connection queue and wait INFO_AGENT_REPORTS */

listen(sockfd, 5);
while(1)
{

char ch;

printf("\n\n Task agent waiting...\n");

/* Accept a connection to collect report from INFO_AGENT */

client_len = sizeof(client_address);
new_sockfd = accept(sockfd,(struct sockaddr *)&client_address, &client_len);
if (new_sockfd==-1) { perror("Connection Not Accepted!!"); return(1);}
else
{
printf("\n Information agent is connected\n");
if(inet_ntop(AF_INET,&client_address.sin_addr.s_addr,clntName,sizeof(clntName))!=NULL)
{
ia_address = fopen("info_agent_report.txt","a+");
fprintf(ia_address,"\nFrom InformationAgent:%s\n",clntName);
fclose(ia_address);
}
printf("\n Task agent received the contents and saved it in 'info_agent_report' file");
log=open("info_agent_report.txt",O_CREAT|O_RDWR|O_APPEND,0777);
if(log==-1)
{
perror("cannot open info_agent_report file\n");
return(1);
}

do
{
x1=read(new_sockfd, buffer1, 1024);
x2=write(log,buffer1,x1);
}
while (x1>0);
close(log);
close(new_sockfd);

}

/*this is to connect to other server */
/* connect socket to the interface server's socket. */

int interface_sockfd = socket(AF_INET,SOCK_STREAM,0);

serveraddress.sin_family = AF_INET;
serveraddress.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddress.sin_port = 9735;
len = sizeof(serveraddress);
//len=sizeof(address);


if((result1 = connect(interface_sockfd, (struct sockaddr *)&serveraddress, len))==0)
printf("\n Connecting to the Interface server\n");

if(result1 == -1)
{
perror(" Not able to connect to Interface Server!!!!\n");
}

fh = open(fname , O_RDONLY);
if(fh==-1)
{
perror(" INFO_AGENT_REPORT File is Not Opened!!\n");
return(1);
}


do
{
cont=read(fh, buffer, buffsize);
cont2=write(interface_sockfd,buffer,cont);
}
while (cont==1024);
close(fh);
printf("\n Task agent has sent 'info_agent_report' file to the Interface Server\n\n");
close(interface_sockfd);
}
}

最佳答案

getnameinfo()比较新颖。

你喜欢用它

char clntName[INET6_ADDRSTRLEN];
char portName[6]; // I wonder if there is no appropriate constant...

if(getnameinfo(&client_address,sizeof client_address,clntName,sizeof(clntName),NULL,0,NI_NUMERICHOST|NI_NUMERICSERV|NI_NUMERICSCOPE)==0){
printf("Client = %s/%s\n",clntName,portName);
} else {
printf("Unable to get address\n");
}

完成后,混合 IPv4 和 IPv6 调用将不会有任何困难。

关于c - 如何在服务器端显示客户端IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19509420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com