gpt4 book ai didi

c - Unix C程序---socket和select函数

转载 作者:行者123 更新时间:2023-11-30 15:36:50 25 4
gpt4 key购买 nike

我刚刚开始学习 Unix C 编程,有一个问题我无法解决。在这个程序中,我制作了一个带有套接字和选择功能的简单服务器。当我使用不同的终端启动尝试连接服务器的客户端程序时,服务器可以接受新客户端并成功连接(根据我的代码打印一句话)。但是,当我尝试在客户端程序中将客户端程序中的消息发送到服务器(通过 scanf() 和 send() )时,服务器只是阻塞在那里并且无法接收到消息。您能帮我找出程序中的缺陷吗?非常感谢您的任何建议!这是我的服务器程序的代码(我认为客户端程序没有问题):

  1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <netinet/in.h>
7 #include <string.h>
8 #include <fcntl.h>
9 #include <sys/select.h>
10 //all kinds of header
11 main(){
12 int sfd; //server's file descriptor
13 int fdall[100]; //array for client descriptor
14 int count=0; //total number of clients
15 int maxfd=0; // max value of all descriptors
16 char buf[1024]={0}; //used for receiving message from client, by recv()
17 fd_set fds; // readset in select()
18 sfd=socket(AF_INET,SOCK_STREAM,0);
19
20 struct sockaddr_in add;
21 add.sin_family=AF_INET;
22 add.sin_port=htons(9999);
23 add.sin_addr.s_addr=inet_addr("192.168.122.1");
24 int i,j,r;
25
26 r=bind(sfd,(struct sockaddr*)&add,sizeof(add));
27 if(r==-1) printf("bind:%m\n"),exit(-1);
28 else puts("bind ok!");
29 listen(sfd,10);
30
31 while(1){
32 FD_ZERO(&fds);
33 maxfd=0;
34 FD_SET(sfd,&fds);
35 maxfd=maxfd>sfd?maxfd:sfd;
36 for(i=0;i<100;i++){
37 fdall[i]=-1;
38 }
39 r=select(maxfd+1,&fds,0,0,0);
40 if(FD_ISSET(sfd,&fds)){
41 fdall[count]=accept(sfd,0,0);
42 puts("new client!");
43 count++;
44 }
45 for(i=0;i<count;i++){
46 if(FD_ISSET(fdall[i],&fds)!=-1&&fdall[i]!=-1){
47 r=recv(fdall[i],buf,1023,0);
48 for(j=0;j<count;j++){
49 if(fdall[j]!=-1){
50 send(fdall[j],buf,r,0);
51 }
52 }
53 }
54 }
55 }
56 }

最佳答案

您不能使用scanf从套接字读取。 scanf将从STDIN读取;这就是导致你受阻的原因。您也不能使用 fscanf,因为这需要 FILE *,尽管可以使用 freopen 从套接字创建文件,它会假设它可以坐在那里阅读其核心内容,而不是使用select

您需要做的是从套接字读取到缓冲区中。当您拥有适当数量的数据(可能由换行符分隔)时,请使用 sscanf (注意额外的 s),并确保您正在解析的字符串是 NUL 终止。

关于c - Unix C程序---socket和select函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22437691/

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