SIGIO

来源:互联网 发布:微信数据丢失怎么恢复 编辑:程序博客网 时间:2024/06/16 19:46

异步信号模式,其他方式有多线程或者单线程阻塞

 

接收端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <netinet/in.h> /*socket address struct*/
#include <arpa/inet.h> /*host to network convertion*/
#include <sys/socket.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/ioctl.h>
#define MAX_TRANSPORT_LENTH 512

static int g_var = 0;
static int g_skt = 0;
void sig_handler(int signum)
{
char buf[MAX_TRANSPORT_LENTH+1] = "";
int len = 0;
len = read(g_skt,buf,MAX_TRANSPORT_LENTH);
if (len<0)
{
perror("Read socket failed");
exit(-1);
}
else
{
printf("In SIGIO handler,got msg:%s/n",buf);
}
}

int main()
{
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(50001);

signal(SIGIO,sig_handler);

g_skt = socket(AF_INET,SOCK_DGRAM,0);
if(g_skt == -1)
{
perror("Create socket failed");
exit(-1);
}

int len = sizeof(addr);
int ret = 0;

int on = 1;
ret = fcntl(g_skt, F_SETOWN, getpid());//Set process or process group ID to receive SIGIO signals
if(-1 == ret)
{
perror("Fcntl F_SETOWN failed");
exit(-1);
}
ret = ioctl(g_skt, FIOASYNC, &on);
if(-1 == ret)
{
perror("Fcntl FIOASYNC failed");
exit(-1);
}
ret = ioctl(g_skt, FIONBIO, &on);
if(-1 == ret)
{
perror("ioctl FIONBIO failed");
exit(-1);
}

ret = bind(g_skt,(struct sockaddr *)&addr,sizeof(addr));
if(-1 == ret)
{
perror("Bind socket failed");
exit(-1);
}
while(1)
{
printf("I am running/n");
sleep(2);
}
close(g_skt);
}


发送端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <netinet/in.h> /*socket address struct*/
#include <arpa/inet.h> /*host to network convertion*/
#include <sys/socket.h>
#include <signal.h>
#define MAX_TRANSPORT_LENTH 512

int main()
{
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.106");
addr.sin_port = htons(50001);

int sock;
sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock == -1)
{
perror("Create socket failed");
exit(-1);
}

int ret;
ret = connect(sock,(struct sockaddr *)&addr,sizeof(addr));
if(ret == -1)
{
perror("Connect socket failed");
exit(-1);
}
while(1)
{
printf("Will send messge to server/n");
write(sock,"Some unknown infomation/n",MAX_TRANSPORT_LENTH);
sleep(1);
}

}

 

 

 

 

原创粉丝点击