资源简介
在学习《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
相关资源
- linux p2p通信
- QT 多线程TCP服务器与客户端
- linux x64 readline-devel-all 安装rpm介质
- Hadoop与Spark安装配置手册
- windows网络编程serverandclient猜拳游戏
- FOCAS2/Ethernet for Linux
- 马哥linux运维整套视频.txt
- QT编写的Socket工具,TCP 以及 UDP 可建立
- Anaconda3-5.3.0-Linux-x86_64.sh
- 完整版CentOS-6.6-i386-bin-DVD1.iso,linux镜
- CentOS-6.6-i386-bin-DVD1.iso,linux镜像文件
- 单词处理程序
- Qt TCP 聊天软件
- Spring+Netty+WebSocket
- TCP通信Qt源码
- linux环境下基于socket通信的ftp系统
- Allegro SPB16 6 Install Guide For Linux 1
- 基于CAsyncSocket类的网络编程-客户端
- 使用CAsyncSocket完成的客户端和服务端
- 上位机发送FINS TCP命令读写PLC数据
- 基于arm版的电子钢琴
- iOS socket连接打印机打印小票
- Windows网络编程第2版-源代码
- spec文件详解
- 老男孩linux笔试题
- tcpClientAndServerTools v1.0.0.rar
- linuxC获取PCI设备名和厂商名
- linux驱动开发详解第2版光盘资料
- UNIX Linux程序设计教程
- 用QT做的LINUX下串口通信测试可用
评论
共有 条评论