Linux网络编程5——使用UDP协议实现群聊

引言

本文实现的功能类似于我之前所写的一篇博文(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类型为聊天信息,则服务器将其转发给所有客户端。

代码

明天再说吧,大哥哥要先看火影了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。