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

相关文章

来自专栏码匠的流水账

聊聊spring cloud gateway的SecureHeadersGatewayFilter

本文主要研究下spring cloud gateway的SecureHeadersGatewayFilter

1562
来自专栏向治洪

React Native调用原生组件

在React Native开发过程中,有时候我们可能需要访问平台的API,但react Native还没有相应的实现,或者是React Native还不支持一些...

1936
来自专栏Seebug漏洞平台

Memcached 命令执行漏洞(CVE-2016-8704、CVE-2016-8705、CVE-2016-8706)简析

Author: p0wd3r, dawu (知道创宇404安全实验室) Date: 2016-11-01 0x00 漏洞概述 1.漏洞简介 Memcached...

3396
来自专栏潇涧技术专栏

App Launch Time Measurement

关于应用启动时间测量的分析已经有不少不错的文章做了总结,下面是比较好的几篇: 1.Android性能优化典范-第6季 2.测量Activity 的启动时间 ...

862
来自专栏向治洪

Android 应用安装过程分析

在之前的文章中,我们对PakageManagerService启动流程分析 做了简单的介绍,并对PMS系统的启动流程做了详细的解析。上面只是说到了Android...

5909
来自专栏Android机动车

使用Retrofit+RxJava实现带进度下载文件

Retrofit+RxJava已经是目前市场上最主流的网络框架,使用它进行平常的网络请求异常轻松,之前也用Retrofit做过上传文件和下载文件,但发现:使用R...

1591
来自专栏Android干货

Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator                       Android Studi

2868
来自专栏向治洪

React Native调用原生组件

在React Native开发过程中,有时候我们可能需要访问平台的API,但react Native还没有相应的实现,或者是React Native还不支持一些...

2018
来自专栏开发之途

Gradle 常用配置总结

当项目逐渐演进的过程中,主工程依赖的 Module 可能会越来越多,此时就需要统一配置各个 Module 的编译参数了

963
来自专栏狂码一生

用MFC写一个聊天室程序 - 学习笔记

下面的服务器端与客户端的程序与步骤是我在学习MFC网络编程写一个聊天室程序所写的程序,在这里作一个笔记,也希望能帮到一部分刚刚学习的朋友,一起共勉,一起努力历进...

85715

扫码关注云+社区