博客
关于我
io多路复用___select
阅读量:594 次
发布时间:2019-03-12

本文共 2430 字,大约阅读时间需要 8 分钟。

#include #include #include #include #include #include #define SIZE 30 int tcp_socket(int port);int main(int argc, char *argv[]) {if (argc != 2) {printf("请提供端口号\n");return 1;}int sock = tcp_socket(atoi(argv[1]));if (sock == -1) {printf("创建socket失败\n");return 1;}int r;fd_set reads;int temp;socklen_t len;int fd_max;struct timeval timeout;char buf[SIZE]; FD_ZERO(&reads);FD_SET(sock, &reads);fd_max = sock;struct sockaddr_in cli_addr;while (1) {    temp = reads; // 创建临时集合保存原状态    timeout.tv_sec = 5; // 设置超时时间    timeout.tv_usec = 0;    r = select(fd_max + 1, &temp, NULL, NULL, &timeout);    if (r == -1) break;    else if (r == 0) {        printf("连接超时\n");        continue;    } else {        for (int i = 3; i < fd_max + 1; i++) { // 从3开始检查其他fd            if (FD_ISSET(i, &temp)) { // 检查是否有变化                if (i == sock) { // 有新客户端连接                    len = sizeof(cli_addr);                    int cli_sock = accept(sock, (struct sockaddr *)&cli_addr, &len);                    if (cli_sock == -1) continue;                    FD_SET(cli_sock, &reads);                    if (fd_max < cli_sock) {                        fd_max = cli_sock;                    }                    printf("收到新连接:%d\n", cli_sock);                } else { // 有客户端向服务器发送数据                    memset(buf, 0, SIZE);                    r = read(i, buf, SIZE - 1);                    if (r == 0) { // 客户端断开连接                        FD_CLR(i, &reads);                        close(i);                        printf("客户端 %d 断开连接\n", i);                    } else if (r > 0) {                        buf[r] = '\0';                        printf("从客户端 %d 收到消息:%s\n", i, buf);                        write(i, buf, r); // 将消息发送回客户端                    } else {                        printf("读取数据错误\n");                        exit(1);                    }                }            }        }    }}close(sock);return 0; } int tcp_socket(int port) {int sock;struct sockaddr_in addr;sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1) return -1; // 设置端口复用const int on = 1;if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))) {    printf("设置端口复用失败\n");    return -1;}memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = htonl(INADDR_ANY);addr.sin_port = htons(port);int r = bind(sock, (struct sockaddr *)&addr, sizeof(addr));if (r == -1) return -1;r = listen(sock, 10);if (r == -1) return -1;return sock; }

转载地址:http://gznxz.baihongyu.com/

你可能感兴趣的文章
wincc实现手机APP远程监控
查看>>
pandas DataFrame进行条件选取数据时出现SettingWithCopyWarning的解决方法
查看>>
3.6.X版本的OSG无法打开osgShadow/ShadowVolume的问题
查看>>
LSM树
查看>>
Linux上elasticsearch7集群搭建
查看>>
打开网站工程时遇到配置bower显示404的问题。
查看>>
vue手写 头部 滑动按钮 点击查看更多,可折叠
查看>>
为什么 RTP 的视频的采样率是 90kHz ?
查看>>
IDEA快捷键CTRL+SHIFT+F无效
查看>>
IDEA 找不到 Persistence窗口解决办法
查看>>
ERROR: unable to bind listening socket for address...
查看>>
vagrant启动时提示 mount: unknown filesystem type 'vboxsf'
查看>>
海思SDK mkimage command not found
查看>>
QT5 退出窗口
查看>>
ov9732 datasheet
查看>>
rk3399平台gt9xx触摸屏驱动分析
查看>>
X工厂 ERP (SBO) 2006 项目案例
查看>>
Android 吸顶布局
查看>>
python学习笔记2.3- 循环、判断
查看>>
python学习笔记4.1-python高级之生成器
查看>>