专栏首页转载gongluck的CSDN博客第25章 信号驱动式I/O

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

相关文章

  • 第8章 基本UDP套接字编程

    客户端: #include "../Gnet.h" void do_client(int udpfd, struct sockaddr* pserver_ad...

    _gongluck
  • 第15章 Unix域协议

    #include <sys/un.h> struct sockaddr_un { sa_family_t sun_family; /* AF_LOC...

    _gongluck
  • MFC中CFileDialog的用法

    CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTS...

    _gongluck
  • 第8章 基本UDP套接字编程

    客户端: #include "../Gnet.h" void do_client(int udpfd, struct sockaddr* pserver_ad...

    _gongluck
  • 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算...

    mantch
  • arthas命令watch观察方法调用(上)

    今天分享一个非常重要的命令watch,官网定义这个方法的功能如下:让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OG...

    FunTester
  • RuntimeError: copy_if failed to synchronize: device-side assert triggered

    在使用pytorch训练的时候提示RuntimeError: copy_if failed to synchronize: device-side assert...

    于小勇
  • H3C 基本配置

    一、H3C的前世今生: H3C的前身华为3COM公司,是华为与美国3COM公司的合资公司(有传言说是当时Cisco起诉华为抄袭它的东西,所以华为找了一家美国挺有...

    小手冰凉
  • 全球安全厂商针对“Wannacry勒索蠕虫”响应与处置方案汇总

    一般来说,影响力最大的事物并不是最牛掰的事物——这件事可以反映到周末爆发的WannaCry勒索软件身上。 WannaCry可以说是史上影响、危害最大的勒索程序没...

    FB客服
  • 【T-SQL】分布抽取部分数据

    好吧,我确实不知道该怎么起这个标题,整了一个“分布”,感觉还有点高档,其实没啥技术含量,看完你就知道了。情况是这样,刚刚接到一个临时任务,需要让几个营业点的销售...

    AhDung

扫码关注云+社区

领取腾讯云代金券