第25章 信号驱动式I/O

(1)建立SIGIO信号的信号处理函数

(2)设置套接字属主

(3)开启套接字的信号驱动式I/O标志

#include "../Gnet.h"

int fd;

void sig_io(int sig)
{
    char buf[MAX_LINE];
    int nread;
    struct sockaddr_in client_addr;
    socklen_t client_addr_len;

    printf("in sig_io\n");
    nread = recvfrom(fd, buf, MAX_LINE, 0,(struct sockaddr*)&client_addr, &client_addr_len);
    if(nread > 0)
        sendto(fd, buf, nread, 0, (struct sockaddr*)&client_addr, client_addr_len);
    else
        printf("nread < 0\n");

    printf("out sig_io\n");
}

void do_server(int udpfd)
{
    const int on = 1;
    sigset_t old, new;

    fd = udpfd;

    signal(SIGIO, sig_io);//注册信号处理函数
    if(fcntl(udpfd, F_SETOWN, getpid()) < 0)
        perr_exit("fcntl F_SETOWN error.27");//设置套接字属主
    if(ioctl(udpfd, FIONBIO, &on) < 0)
        perr_exit("ioctl FIONBIO error.29*");//非阻塞IO
    if(ioctl(udpfd, FIOASYNC, &on) < 0)
        perr_exit("ioctl FIOASYNC error.31");//信号驱动IO

    sigemptyset(&new);
    sigaddset(&new, SIGIO);
    sigprocmask(SIG_UNBLOCK, &new, &old);
}

int main(int argc, const char* argv[])
{
    int udpfd;
    struct sockaddr_in server_addr;

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);

    udpfd = Socket(AF_INET, SOCK_DGRAM, 0);
    Bind(udpfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
    printf("waiting for connecting.\n");

    do_server(udpfd);
    while(1)
        ;

    return 0;
}

github:https://github.com/gongluck/unp-notes

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分布式系统和大数据处理

C#网络编程(基本概念和操作) - Part.1

C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助。如果想...

873
来自专栏pythonlove

DNS服务器的基础应用及主从同步

域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互...

722
来自专栏Spark学习技巧

kylin集群Nginx负载均衡

Nginx负载均衡 1, Nginx负载均衡简介 跨多个应用程序实例的负载平衡是优化资源利用率,最大化吞吐量,减少延迟以及确保容错配置的常用技术。 可以使用ng...

2827
来自专栏网络

VRRP基本配置

配置VRRP组 要启用VRRP,最基本的配置就是要创建VRRP组,并为VRRP组配置虚拟IP地址 Vrrp group-number ip ip-address...

2246
来自专栏杨建荣的学习笔记

对分区表导入导出的水平,垂直切分(r2第22天)

在工作中有时候碰到一些分区表,业务数据量很大,可能几百G,上T的规模,而且做数据的导入导出的时候,会感觉到exp/expdp的时候生成的dump文件太大了,做导...

2816
来自专栏陆耀伟的专栏

DNS故障对TDW影响评估及改进方案探索

TDW集群的所有slaves机器都需要通过DNS域名解析方式连接master,也就是在所有slaves机器上配置master的域名,而非直接的IP地址;用户需要...

2610
来自专栏知识分享

五,ESP8266 TCP服务器多连接(基于Lua脚本语言)

一些时间去准备朋友的元器件了... 接着写,,争取今天写完所有的文章,,因为答应了朋友下周5之前要做好朋友的东西 对于TCP大家在玩AT指令的时候有没有发现客户...

4767
来自专栏xcywt

UNIX域协议(命名套接字)

这里主要介绍命名UNIX域套接字 1.什么是UNIX域套接字 Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务通信的一种方式。是进程间通信(...

21110
来自专栏技巅

Glusterfs之rpc模块源码分析(上)之RPC概述

1857
来自专栏转载gongluck的CSDN博客

第16章 Sun RPC

RPC:远程过程调用 ? ? ? ? 默认情况下服务器并不多线程化: rpcgen -C data.x -DDEBUG gcc server.c data_s...

3507

扫码关注云+社区