一、设计思路
服务器接收来自客户端的连接请求,当有客户端发送过来数据时,
服务器将数据保存到全局缓冲区,并将数据循环发送给已经连接的客户端
二、代码展示
1. 服务器端charroom_server_01.c
#include <stdio.h>
#include <string.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h> //for INADDR_ANY
#define MAX_CLIENT_NUM 10 /* 客户端最大连接数 */
#define MAXLENGHT 1024 /* 最大缓存长度 */
#define SERVER_PORT 5012 /* 服务器端的端口号 */
#define LISTEN_MAX_NUM 5 /* 监听队列的最大值 */
int main(void)
{
int clientSocket = -1, listenSocket = -1;
int client[MAX_CLIENT_NUM];
char buf[MAXLENGHT] = {0};
fd_set allset, rset;
socklen_t clilen;
struct sockaddr_in cliaddr, seraddr;
int i = -1, maxi = -1, maxfd = -1, ret = -1, reuse = -1, iReady = -1;
struct timeval tv;
/* 创建TCP监听socket */
listenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == listenSocket)
{
printf("create socket error: %s\n",strerror(errno));
return -1;
}
else
{
printf("listenSocket = %d\n", listenSocket);
}
bzero(&seraddr, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
seraddr.sin_port = htons(SERVER_PORT);
/* 设置端口重用 */
reuse = 1;
ret = setsockopt(listenSocket,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));
if (0 > ret)
{
printf("setsockopt error: %s\n",strerror(errno));
return -1;
}
/* 绑定IP和端口 */
ret = bind(listenSocket, (struct sockaddr *)&seraddr, sizeof(seraddr));
if (0 > ret)
{
printf("bind error: %s\n",strerror(errno));
return -1;
}
/* 设置监听 */
ret = listen(listenSocket, LISTEN_MAX_NUM);
if