【发布时间】:2014-03-16 13:49:42
【问题描述】:
我刚开始学习 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 }
【问题讨论】:
-
检查所有库和系统调用的返回值,并打印错误和意外返回值的调试消息。这是解决此类 IO 代码问题的第一步。也在客户端执行此操作(而不是
scanf,也许您应该将fgets用于这样的应用程序,顺便说一句)。