linux select 异步,Linux上用select()实现异步的Echo服务器

博客给出了非阻塞模式服务器(Echo服务器)的代码。代码在Linux环境下,设置服务器Addr在18000端口任意IP监听,将serverFd设为非阻塞方式,绑定端口、创建等待队列,使用select函数选择可用的fd,实现非阻塞模式等待客户连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#相关代码, [四号程序员] http://www.coder4.com

/*

?* main.cc

?*

?* ?Created on: 2009-11-30

?* ? ? ?Author: liheyuan

?* ? ?Describe: 非阻塞模式服务器(Echo服务器)

?*

?* ? Last Date: 2009-11-30

?* ? CopyRight: 2009 @ ICT LiHeyuan

?*/

?

#include

using namespace std;

?

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

?

#define SERVER_PORT 18000

?

#define SERVER_QUEUE 10

#define FD_SET_SIZE 10

#define MAX_BUF 16

?

int main() {

?

?? ?//设置服务器Addr,在18000,任意IP监听

?? ?int serverFd;

?? ?serverFd = socket(AF_INET, SOCK_STREAM, 0);

?

?? ?/* 设置 serverFd 为非阻塞方式 */

?? ?int opt = SO_REUSEADDR;

?? ?setsockopt(serverFd, SOL_SOCKET, opt, &opt, sizeof(opt));

?

?? ?struct sockaddr_in serverAddr;

?? ?socklen_t serverAddrLen = sizeof(sockaddr_in);

?? ?serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

?? ?serverAddr.sin_port = htons(SERVER_PORT);

?

?? ?//绑定

?? ?if (bind(serverFd, (sockaddr*) &serverAddr, serverAddrLen)) {

?? ? ? ?cout << "Binding on " << SERVER_PORT << " fail." << endl;

?? ? ? ?return -1;

?? ?}

?

?? ?//创建等待队列

?? ?listen(serverFd, SERVER_QUEUE);

?

?? ?//设定fd_set

?? ?fd_set readfds, testfds;

?? ?FD_ZERO(&readfds);

?? ?FD_SET(serverFd,&readfds);

?

?? ?//非阻塞模式等待客户连接

?? ?struct sockaddr_in clientAddr;

?? ?int clientFd;

?? ?socklen_t clientAddrLen;

?? ?int len;

?? ?char buf[MAX_BUF];

?? ?while (1) {

?? ? ? ?FD_SET(serverFd,&readfds);

?? ? ? ?testfds = readfds;

?

?? ? ? ?//选择readfds中可用的fd

?? ? ? ?if (select(FD_SET_SIZE, &testfds, (fd_set *) NULL, (fd_set *) NULL,

?? ? ? ? ? ? ? ?(struct timeval *) NULL) > 0) {

?? ? ? ? ? ?if (FD_ISSET(serverFd,&testfds)) {

?? ? ? ? ? ? ? ?//如果服务器fd可用,则为accept

?? ? ? ? ? ? ? ?clientAddrLen = sizeof(sockaddr_in);

?? ? ? ? ? ? ? ?clientFd =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值