资源简介
在学习《UNIX网络编程》基础上自己动手实现TCP服务器和客户端通讯,这个版本是进阶版程序——实现多个客户端的之间的通讯。程序包含了常规网络通讯的主要步骤,除此之外还运用了select()和poll()等技术,具有一定难度,程序思路清晰,代码注释详细,适合有一定基础的人学习。代码已经无误通过测试。初学者可以休息我的入门版程序——实现单个客户端的之间的通讯,可见我的其他资源。

代码片段和文件信息
/*服务器端程序:一个服务器和多个客户端通讯(复用)*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024
int main(int argc const char * argv[])
{
int in;
int connfdsockfd;
struct epoll_event evevents[20]; //ev用于注册事件数组用于回传要处理的事件,告诉内核要监听什么事
//============创建一个epoll的句柄,其中256为你epoll所支持的最大句柄数==========
int epfd=epoll_create(256);//创建一个epoll的句柄,其中256为你epoll所支持的最大句柄数
struct sockaddr_in client_addr;
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(11277);
server_addr.sin_addr.s_addr =INADDR_ANY;
bzero(&(server_addr.sin_zero) 8);
int server_sock_fd = socket(AF_INET SOCK_STREAM 0);
ev.data.fd=server_sock_fd; //设置与要处理的事件相关的文件描述符
//ev.events=EPOLLIN|EPOLLOUT|EPOLLET; //设置要处理的事件类型,可读可写
ev.events=EPOLLIN|EPOLLET; //设置要处理的事件类型先监听状态,读数据然后再根据需求修改
//============注册epoll事件====================
epoll_ctl(epfdEPOLL_CTL_ADDserver_sock_fd&ev);
if(server_sock_fd == -1)
{
perror(“socket error“);
return 1;
}
char recv_msg[BUFFER_SIZE];
char input_msg[BUFFER_SIZE];
if(connect(server_sock_fd (struct sockaddr *)&server_addr sizeof(struct sockaddr_in)) == 0)
{
for(;;)
{
//================等待epoll事件的发生=================
int nfds=epoll_wait(epfdevents20500);
for(i=0;i {
if(events[i].events&EPOLLOUT) //监测事件类型,若有数据发送,写socket
{
printf(“send message to server: “);
bzero(input_msg BUFFER_SIZE);
fgets(input_msg BUFFER_SIZE stdin);
sockfd = events[i].data.fd;
//write(sockfd recv_msg n);
write(sockfd input_msg BUFFER_SIZE);
//send(sockfdinput_msgBUFFER_SIZE0);
ev.data.fd=sockfd;
ev.events=EPOLLIN|EPOLLET; //写完数据后,将事件类型变为读操作
epoll_ctl(epfdEPOLL_CTL_MODsockfd&ev); //修改后需要重新注册,这里使用EPOLL_CTL_ADD就会出错
}
else if(events[i].events&EPOLLIN) //监测事件类型,若有数据到来,读socket
{
bzero(recv_msg BUFFER_SIZE);
if((n = read(server_sock_fd recv_msg BUFFER_SIZE)) <0 )
{
printf(“read error!“);
}
ev.data.fd=server_sock_fd;
ev.events=EPOLLOUT|EPOLLET; //读完数据后,将事件类型变为写操作
printf(“message from server: %s\n“recv_msg);
epoll_ctl(epfdEPOLL_CTL_MODserver_sock_fd&ev); //修改后需要重新注册,这里使用EPOLL_CTL_ADD就会出错
}
}
}
}
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6937 2018-06-10 17:15 server5.c
文件 3513 2018-06-10 17:20 client5.c
----------- --------- ---------- ----- ----
10450 2
相关资源
- Omron ETN21模块进行modbustcp通讯
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- 通信软件的具体实例──基于Socket的
- 用Socket编程实现FTP
- websocket实现一对一聊天
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 组态王中S7-300TCP驱动
- 基于Apache Mina实现的TCP长连接和短连接
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- CVI下的TCP服务器和客户端
- 代码客:G-TcpServer(IOCP) 1.0 正式版及
- linux下用多进程同步方法解决生产者
- TCP 发包工具(windows)
- SOCKET 网络编程 计算机网络 作业 客户
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- 用Socket写的简易FTP服务器和客户端
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
评论
共有 条评论