linux下c控制socket并发,epoll+socket实现并发服务器 Linux C(版本一)

#include/**********************************************

*epoll_socket 实现并发服务器(简易)

* 这个只是一个接收数据的例子,还有很多小细节没有处理,比如客户端断开后,从epoll中删除fd(以后的版本再更新)

*作者:邱于涵

*2017年6月23日21:14:10

*QQ:1031893464

*********************************************/

//服务器监听端口

#define PORT 12345

//最大连接数

#define MAXCLIENT 100

//最大事件数 epoll event

#define MAXEVENTS 10

//处理客户端

void do_client(int fd)

{

//数据缓冲

char buff[1024];

//接收数据

int ret=recv(fd,buff,1024,0);

//检测是否断开

if(ret==0)

{

return;

}

if(ret<0)

{

return;

}

//输出接收到的数据的内容

printf("data:%s\n",buff);

}

int main(){

//服务器socket 描述符

int sockfd;

//服务器 ,客户端 sockaddr_in

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

//创建服务器socket

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("socket");

exit(1);

}

//设置server_addr

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(PORT);

server_addr.sin_addr.s_addr=INADDR_ANY;

//初始化 0

bzero(&(server_addr.sin_zero),8);

//绑定

if(bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))==-1)

{

perror("bind");

exit(1);

}

printf("bind success \n");

//监听(第二个参数是未完成队列,跟系统的链接数量没有任何关系,相当于设置一个瞬间能够处理的阈值。)

if(listen(sockfd,10)==-1)

{

perror("listen");

exit(1);

}

printf("listen success\n");

size_t sin_size=sizeof(struct sockaddr_in);

//一个是用来注册事件,一个是触发事件数组

struct epoll_event ev,events[MAXEVENTS];

int conn_sock,nfds,epollfd;

//创建epoll

epollfd =epoll_create(MAXCLIENT);

if(epollfd==-1)

{

perror("epoll_create");

exit(1);

}

printf("epoll_create\n");

ev.events=EPOLLIN;

ev.data.fd=sockfd;

//注册事件

if(epoll_ctl(epollfd,EPOLL_CTL_ADD,sockfd,&ev)==-1)

{

perror("epoll_ctrl");

exit(1);

}

printf("epoll_ctl \n");

while(1)

{

printf(" epoll_wait\n");

//等待事件触发(触发了的事件都会保存在event事件数组里面,这里会阻塞,直到有事件触发,事件数量在nfds里面)

nfds=epoll_wait(epollfd,events,MAXEVENTS,-1);

if(nfds==-1)

{

perror("epoll_pwait");

exit(1);

}

printf("wait,returns nfds=%d/n",nfds);

//循环遍历所有事件 进行处理

for(int n=0;n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值