本文主要是为熟悉Linux下网络编程,而实现一个简单的网络聊天室程序。 以Poll实现I/O复用技术来同时处理网络连接和用户输入,实现多个用户同时在线群聊。
其中客户端实现两个功能:一:从标准输入读入用户数据,并将用户数据发送到服务器;二:接收服务器发送的数据,并在标准输出打印。
服务端功能为:接收客户端数据,并将客户数据发送到登录到该服务端的所有客户端(除数据发送的客户端外)。
服务端程序 chat_server:
#define _GNU_SOURCE 1
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
#include<poll.h>
//最大用户数
#define USER_LIMIT 5
#define BUFFER_SIZE 64
#define FD_LIMIT 65535
/*客户端数据:客户端地址 写缓冲区 读缓冲区*/
struct client_data
{
struct sockaddr_in address;
char* write_buf;
char buf[BUFFER_SIZE];
};
int setnonblocking(int fd)
{
int old_opton=fcntl(fd,F_GETFL);
int new_option=old_opton | O_NONBLOCK;
fcntl(fd,F_SETFL,new_option);
return old_opton;
}
int main(int argc,char* argv[])
{
if(argc<=2)
{
printf("usage: %s ip_address port_number\n",basename(argv[0]));
return 1;
}
const char* ip=argv[