1、先总结一下常用API的函数原型。
- socklen_t socket(int nFileds,int nType,int nFlag);
- int bind(int nSocket,sockaddr *pAddr,int nLen);
- int listen(int nSocket,int nListenNum);
- int accept(int nSocket,socketaddr *pAddr,int *pnLen);
socket 的API定义包含在头文件 sys/socket.h,数据类型定义在 sys/types.h
sockaddr以及sockaddr_in结构体的定义在头文件 netinet/in.h
IP地址转换的时候用到的字符串和DWORD值转换函数inet_addr(char*),inet_ntoa(sockaddr_in addr)包含在arpa/inet.h
设置套接字为非阻塞套接字,使用函数int fcntl(int nFd,int nCmd,...),该函数包含在头文件fcntl.h中
信号处理函数的设置采用函数sighandler_t signal(int nSig,void(*DealFun)(int nSig)),该函数包含在头文件signal.h中
今天想测试一下socket编程中,信号驱动方式的使用,不知道原因在哪儿,信号貌似收不到。。。。先贴代码。。。
代码已经修改完毕,能够正常通信,服务器采用tcp连接,当socket有连接的时候,受到内核的信号SIGIO。
函数后面的accept是想确认一下,在异步通信的时候,这些函数是不是阻塞的,果然是,虽然设置socket为O_ASYNC。
- #include<stdio.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #include<sys/signal.h>
- #include<fcntl.h>
- #include<string.h>
- #include<netinet/in.h>
- #include<arpa/inet.h>
- #include<unistd.h>
- #define MAX_LISTEN_NUM 10
- #define MAX_CONNECT_NUM 128
- #define LISTEN_PORT 12345
- static int g_nCount =0;
- void DealSignalIO(int nSig)
- {
- printf("nSig (%d) == SIGIO(%d) \n",nSig,SIGIO);
- printf("SignalIO count: %d\n",g_nCount++);
- }
- int main()
- {
-
- int nListenSocket = 0,nSubSocket[MAX_CONNECT_NUM],nRet = 0;
- nListenSocket = socket(AF_INET,SOCK_STREAM,0);
- if(-1 == nListenSocket)
- {
- perror("socket ");
- return -1;
- }
- sockaddr_in MyAddr;
- MyAddr.sin_addr.s_addr = inet_addr("10.10.148.146");
- MyAddr.sin_port = htons(LISTEN_PORT);
- nRet = bind(nListenSocket,(sockaddr*)&MyAddr,sizeof(sockaddr));
- if(-1 == nRet)
- {
- perror("bind ");
- return -1;
- }
- nRet = listen(nListenSocket,MAX_LISTEN_NUM);
- if(-1 == nRet)
- {
- perror("listen");
- return -1;
- }
- //set the socket not block
- //nRet = fcntl(nListenSocket,F_SETFL,O_NONBLOCK);
- //set the socket asynchronous
- nRet = fcntl(nListenSocket,F_SETFL,O_ASYNC);
- if(-1 == nRet)
- {
- perror("fcntl ");
- return -1;
- }
- //set the SIGIO deal function
- signal(SIGIO,DealSignalIO);
- //set the signal's owner
- nRet = fcntl(nListenSocket,F_SETOWN,getpid());
- if(-1 == nRet)
- {
- perror("fcntl ");
- return -1;
- }
- //accept
- int nLen = 0;
- nRet = accept(nListenSocket,(sockaddr*)&MyAddr,(socklen_t*)&nLen);
- if(-1 == nRet)
- {
- perror("accept ");
- }
- else
- {
- printf("test if accept is blocked \n");
- }
- while(1)
- sleep(2);
-
- return 0;
- }
阅读(3020) | 评论(1) | 转发(0) |