1.相关函数
int socket(int sockfd, type, flag); //用于服务端,生成一个socket,为客户端提供链接
int bind(sockfd, struct sockaddr*); //为生成的socket绑定相关属性。
int listen(scokfd, bnacklog); // 服务器端监听进程
int accept(clin_fd, struct sockaddr*);//接收请求,产生一个新的socket文件描述符,服务器和客户端开始建立通信
int select(); //判断文件是否有可读数据
2.
*
服务器 与客户端进行通信时,通过clin_fd文件描述符进行一对一通信。
*
当有多个客户端时,可以建立一个内核链表,将所有的socket描述符保存在链表中。然后循环调用select函数监听每个客户端是否有数据发送过来。
然后使用read函数读取发送的数据。
*
可以通过read的返回值来判断客户端是否已关闭。如果已关闭,read返回0.
while(list->next != head)
82 {
83 p=list->next;
84 while(p != head)
85 {
86
87 tv.tv_sec = 1;
88 tv.tv_usec = 200; //select监听时间的溢出时间
89
90 msg=container_of(p,struct user,list); //内核链表的宏
91 // printf("%d\n",msg->clin_fd);
92 FD_ZERO(&rfds);
93 FD_SET(msg->clin_fd, &rfds); //将clin_fd转换为fd*类型
94
95 if((retval=select(100,&rfds,NULL,NULL,&tv)) > 0) //监听
96 {
97 if(read(msg->clin_fd,buf,sizeof(buf)) == 0) //客户端已关闭
98 {
99 list_del(list,) //delete a client
100 close(msg->clin_fd);
101 }
102 printf("%s",buf);
103 memset(buf,0,sizeof(buf));
104 }
105 else if(retval < 0)
106 {
107 perror("error");
108 }
109
110 p = p->next;
111 }
112 }