socket网络通信

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     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值