标签:style blog http color 使用 ar div 代码 html
本文实现的功能类似于我之前所写的一篇博文(Linux之select系统调用_2),区别在于进程之间的通信方式有所不同。之前的文章中,我所使用的是管道,而本文我将会使用socket接口。
客户端发送消息给服务器,服务器收到消息后,会转发该消息给所有客户端。
1. server端维护一个链表,用于存放客户端的联系方式。结构如下:
typedef struct sockaddr_in SA ; typedef struct client_tag { SA ct_addr; struct client_tag* ct_next; }CNODE, *pcNODE;
2. 服务器创建一个socket端口,用于接收客户端发送的消息。消息类别分为:通知上线,通知下线,以及聊天信息。因为消息类别不同,我们使用结构体将客户端发送的消息进行如下封装:
#define TYPE_ON 1 #define TYPE_OFF 2 #define TYPE_CHAT 3
#define SIZE 1024
typedef struct msg_tag { int msg_type; int msg_len; /* 实际消息长度 */ char msg_buf[SIZE]; }MSG, *pMSG;
注意,服务器所创建的socket端口需要绑定自己的联系方式,以便其他客户端可以发消息(sendto函数)给服务器。
3. 服务器使用select轮询函数监听自己的socket端口。当返回值为0(轮询时间内没有客户端发消息)或者-1(收到信号,出错)时,继续轮询;当返回值为1时,说明有客户端发送消息。我们可以从recvfrom函数的传出参数中获取客户端的联系方式,此时根据收到的MSG类型,进行处理。如果MSG类型为上线,则将该客户端的联系方式加入链表;如果MSG类型为下线,则将其从链表中删除;如果MSG类型为聊天信息,则服务器将其转发给所有客户端。
明天再说吧,大哥哥要先看火影了。
标签:style blog http color 使用 ar div 代码 html
原文地址:http://www.cnblogs.com/jianxinzhou/p/3945933.html