码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2014-08-30 01:15:08      阅读:266      评论:0      收藏:0      [点我收藏+]

标签: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类型为聊天信息,则服务器将其转发给所有客户端。

代码

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

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

标签:style   blog   http   color   使用   ar   div   代码   html   

原文地址:http://www.cnblogs.com/jianxinzhou/p/3945933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!