深入UNIX编程:一个简单聊天室的两种实现 (fcntl 和 select)

在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。聊天室的实现方法有很多,但都是利用所谓的“多用户空间”来对信息进行交换,具有典型的多路I/O的架构。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。其架构如图一所示。这样的实现在用户的眼里就是聊天室内任何一个人输入一段字符之后,其他用户都可以得到这一句话。这种“多用户空间”的架构在其他多点通信程序中应用的非常广泛,其核心就是多路I/O通信。多路I/O通信又被称为I/O多路复用(I/O Multiplexing)一般被使用在以下的场合:
 
      客户程序需要同时处理交互式的输入和同服务器之间的网络连接时需要处理I/O多路复用问题; 
      客户端需要同时对多个网络连接作出反应(这种情况很少见); 
      TCP服务器需要同时处理处于监听状态和多个连接状态的socket; 
      服务器需要处理多个网络协议的socket; 
      服务器需要同时处理不同的网络服务和协议。 

      聊天室所需要面对的情况正是第一和第三两种情况。我们将通过在TCP/IP协议之上建立一个功能简单的聊天室让大家更加了解多路I/O以及它的实现方法。 我们要讨论的聊天室功能非常简单, 感兴趣的朋友可以将其功能扩展, 发展成一个功能比较完整的聊天室, 如加上用户认证, 用户昵称, 秘密信息, semote 等功能. 首先它是一个 client/server 结构的程序, 首先启动 server, 然后用户使用 client 进行连接. client/server 结构的优点是速度快, 缺点是当 server 进行更新时, client 也必需更新. 
  
网络初始化 
  
      首先是初始化 server, 使server 进入监听状态: (为了简洁起见,以下引用的程序与实际程序略有出入, 下同) 
sockfd = socket( AF_INET,SOCK_STREAM, 0); 
// 首先建立一个 socket, 族为 AF_INET, 类型为 SOCK_STREAM. 
// AF_INET = ARPA Internet protocols 即使用 TCP/IP 协议族 
// SOCK_STREAM 类型提供了顺序的, 可靠的, 基于字节流的全双工连接. 
// 由于该协议族中只有一个协议, 因此第三个参数为 0 
  
bind( sockfd, ( struct sockaddr *)&serv_addr, sizeof( serv_addr)); 
// 再将这个 socket 与某个地址进行绑定. 
// serv_addr 包括 sin_family = AF_INET 协议族同 socket 
// sin_addr.s_addr = htonl( INADDR_ANY) server 所接受的所有其他 
// 地址请求建立的连接. 
// sin_port = htons( SERV_TCP_PORT) server 所监听的端口 
// 在本程序中, server 的 IP和监听的端口都存放在 config 文件中. 

listen( sockfd, MAX_CLIENT); 
// 地址绑定之后, server 进入监听状态. 
// MAX_CLIENT 是可以同时建立连接的 client 总数. 
server
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值