概述
/* 群聊服务端程序:
* 使用poll同时管理监听socket和连接socket
* 并且使用牺牲空间换取时间的策略来提高服务器性能
* 注意:此服务器程序没有使用到并发的编程技巧
*/
#define _GNU_SOURCE 1
#include <stdio.h>
#include <libgen.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <poll.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#define USER_LIMIT 5 /* 最多用户量 */
#define BUF_SIZE 64 /* 读缓冲区的大小 */
#define FD_LIMIT 65535 /* FD数量限制 */
/* 客户数据:客户端socket地址、待写到客户端的数据的位置、从客户端读入的数据 */
struct client_data
{
sockaddr_in addr;
char *write_buf;
char buf[BUF_SIZE];
};
int setnonblock(int fd);
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("usage: %s ip portn", basename(argv[0]));
return -1;
}
const char *ip = argv[1];
int port = atoi(argv[2]);
sockaddr_in addr;
memset(&addr, '