第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 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

HTML5 game engines

The following are few examples of game engines implemented with HTML5 and JavaSc...

4437
来自专栏编程之路

羊皮书APP(Android版)开发系列(二十五)自动拍照保存照片-适用于Android 5.0 以下版本

功能描述:学校刷卡终端采用android系统,学生在进出学校时需要刷卡,刷卡同时系统自动拍照并保存照片,而拍照保存照片这个过程学生并不知晓,也就是后台自动拍照。

863
来自专栏ml

acm系统开发笔记

时间:     2016/2/29   遇到的困难:  数据库配置的mysql和java(Date)不一致,出现下面错误 1 Date date = new D...

3748
来自专栏Hadoop实操

如何在CDH启用Kerberos的情况下安装及使用Sentry(二)

使用beeline连接HiveServer2,创建columnread角色并授权test表s1列的读权限,将columnread角色授权给fayson_r用户组

6208
来自专栏Hadoop实操

如何使用Hue创建Spark1和Spark2的Oozie工作流

使用Hue可以方便的通过界面制定Oozie的工作流,支持Hive、Pig、Spark、Java、Sqoop、MapReduce、Shell等等。Spark?那能...

1.3K6
来自专栏学海无涯

iOS开发之扫描二维码

自iOS7以后,iOS扫描二维码不需要借助于第三方框架了,苹果在AVFoundation中原生支持了扫描二维码的API,主要涉及到5个类,这5个类在自定义相机或...

2724
来自专栏乐沙弥的世界

WSREP has not yet prepared node for application use

最近PXC 5.7出现脑裂,前端Navicate连接到MySQL时,提示WSREP has not yet prepared node for applicat...

683
来自专栏Windows Community

New UWP Community Toolkit

概述 UWP Community Toolkit 是一个 UWP App 自定义控件、应用服务和帮助方法的集合,能够很大程度的简化和指引开发者的开发工作,相信广...

32911
来自专栏SAP最佳业务实践

想学FM系列(15)-SAP FM模块:预算结构(6)-预算结构操作-过账地址维护

3.2.2.2 过账地址维护 ? 1)FMBSPO - 单个处理 功能:手工维护记账地址 ? 过账分类账:如果使用的是9F付款预算则选则9A,如果使用的是...

4006
来自专栏Android开发经验

Android USB转串口通信开发基本流程

1263

扫描关注云+社区