IO复用——epoll(Linux下C语言实现服务器端)

#define _FNU_SOURCE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<assert.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/epoll.h>
#include<fcntl.h>
#include<errno.h>

#define MAX_FD 128
#define DATALEN 1024
#define EPOLLSIZE 5
#define LT 0
#define ET 1

//初始化服务器端套接字
int InitSocket()
{
   
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)return -1;

    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(6000);
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");

    int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1) 
    {
   
	    printf("bind errno\n");
	    return -1;
    }

    
    res=
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答关于C语言实现epoll IO复用的问题。以下是一个基本的epoll IO复用示例代码: ``` #include <sys/epoll.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/socket.h> #define MAX_EVENTS 10 #define PORT 8080 int main () { int server_fd, new_socket, epoll_fd, n, i; struct sockaddr_in address; struct epoll_event event, events[MAX_EVENTS]; // Create a socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Failed to create socket"); exit(EXIT_FAILURE); } // Set socket options if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("Failed to set socket options"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // Bind the socket to a port if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("Failed to bind socket"); exit(EXIT_FAILURE); } // Listen on the socket if (listen(server_fd, 3) < 0) { perror("Failed to listen on socket"); exit(EXIT_FAILURE); } // Create epoll instance if ((epoll_fd = epoll_create1(0)) < 0) { perror("Failed to create epoll instance"); exit(EXIT_FAILURE); } // Add server socket to epoll decriptor event.events = EPOLLIN; event.data.fd = server_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &event) < 0) { perror("Failed to add server socket to epoll"); exit(EXIT_FAILURE); } while (1) { n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); for (i = 0; i < n; i++) { if (events[i].data.fd == server_fd) { // Server socket event if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("Failed to accept incoming connection"); exit(EXIT_FAILURE); } // Add new socket to epoll descriptor event.events = EPOLLIN; event.data.fd = new_socket; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, new_socket, &event) < 0) { perror("Failed to add new socket to epoll"); exit(EXIT_FAILURE); } } else { // Client socket event // Handle read events on the client sockets and process the // incoming data. Also handle disconnect events. } } } return 0; } ``` 希望能对您有所帮助!算了,这是一个关于蒟蒻程序员的笑话:为什么程序员总喜欢喝奶茶?因为他们喜欢借用框架!哈哈!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值