gpt4 book ai didi

c - 使用 fork() 的多客户端服务器

转载 作者:太空狗 更新时间:2023-10-29 16:37:56 25 4
gpt4 key购买 nike

我正在尝试使用 fork() 创建一个套接字编程服务器来同时处理多个客户端。但我无法正确实现它。我已经尝试了很长时间。我面临的问题是1)解决绑定(bind)问题2)问题如何处理父进程和子进程3) 如何结束服务器程序即..返回到控制台我的单客户端服务器程序运行正常。这是我的多客户端服务器代码。

#include<signal.h>
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>

int main()
{

struct sockaddr_in myaddr ,clientaddr;
int sockid,newsockid;
sockid=socket(AF_INET,SOCK_STREAM,0);
memset(&myaddr,'0',sizeof(myaddr));
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(8888);
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(sockid==-1)
{
perror("socket");
}
int len=sizeof(myaddr);
if(bind(sockid,( struct sockaddr*)&myaddr,len)==-1)
{
perror("bind");
}
if(listen(sockid,10)==-1)
{
perror("listen");
}
int pid,new;
static int counter=0;
for(;;)
{ a:
new =accept(sockid,(struct sockaddr *)&clientaddr,&len);

if(pid=fork()==-1)
{
close(new);
continue;

}
else if(pid>0)
{
counter++;
//wait();
goto a;
printf("here2");
//close(new);
continue;
}
else if(pid==0)
{
counter++;
printf("here 1");
send(new,"hi",100,0);
send(new,(char *) &counter,1,0);

//kill(pid,SIGKILL);
//close(new);
}

}
printf("here3");
close(sockid);
return 0;
}

这是简单的客户端程序

    #include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/types.h>


int main()
{

struct sockaddr_in myaddr ,serveraddr;
int sockid;
sockid=socket(AF_INET,SOCK_STREAM,0);
memset(&myaddr,'0',sizeof(myaddr));
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(8888);
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(sockid==-1)
{
perror("socket");
}
int len=sizeof(myaddr);
if(connect(sockid,(const struct sockaddr*)&myaddr,len)==-1)
{
perror("connect");
}
fprintf(stdout,"Client Online....");
char s[10000];


//gets(s);
//send(sockid,s,10000,0);
recv(sockid,&s,10000,0);
fprintf(stdout,"Server says....");
puts(s);
recv(sockid,&s,10000,0);
fprintf(stdout,"Server says....");
puts(s);

sleep(10);
close(sockid);
return 0;
}

有人可以告诉我我做错了什么以及正确的方法是什么..?任何帮助将不胜感激...

最佳答案

你遇到的主要问题是 == 的优先级高于 =,所以这一行:

if(pid=fork()==-1)

正在将 fork() == -1 的结果分配给 pid,这不是您想要的:它始终是 0fork() 成功时,在子 父级中。您需要使用:

if((pid = fork()) == -1)

您还应该在 fork() 之后在父级中 close(new) - 子级现在拥有该套接字。如果要发送文本版本的计数器,则需要使用 snprintf() 将其转换为文本。 child 也应该在完成后退出 - 在您的代码中执行此操作的最简单方法是跳出循环。经过这些更正后,您服务器中的内部循环如下所示:

for(;;)
{
new = accept(sockid, (struct sockaddr *)&clientaddr, &len);

if ((pid = fork()) == -1)
{
close(new);
continue;
}
else if(pid > 0)
{
close(new);
counter++;
printf("here2\n");
continue;
}
else if(pid == 0)
{
char buf[100];

counter++;
printf("here 1\n");
snprintf(buf, sizeof buf, "hi %d", counter);
send(new, buf, strlen(buf), 0);
close(new);
break;
}
}

关于c - 使用 fork() 的多客户端服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669474/

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