Linux下同时接受普通数据和带外数据

#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <assert.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <fcntl.h>#include <stdlib.h>int main(){const char *ip="127.0.0.1";int port=12345;int ret=0;struct sockaddr_in address;bzero(&address,sizeof(address));address.sin_family=AF_INET;inet_pton(AF_INET,ip,&address.sin_addr);address.sin_port=htons(port);int listenfd=socket(PF_INET,SOCK_STREAM,0);assert(listenfd>=0);ret=bind(listenfd,(struct sockaddr *)&address,sizeof(address));assert(ret!=-1);ret=listen(listenfd,5);assert(ret!=-1);struct sockaddr_in client_address;socklen_t client_addrlength=sizeof(client_address);int connfd=accept(listenfd,(struct sockaddr *)&client_address,&client_addrlength);if(connfd<0){printf("Errno is :%d\n",errno);close(listenfd);}char buf[1024];fd_set read_fds;fd_set exception_fds;FD_ZERO(&read_fds);FD_ZERO(&exception_fds);while(1){memset(buf,'\0',sizeof(buf));FD_SET(connfd,&read_fds);FD_SET(connfd,&exception_fds);ret=select(connfd+1,&read_fds,NULL,&exception_fds,NULL);if(ret<0){printf("selection failure");break;}if(FD_ISSET(connfd,&read_fds)){ret=recv(connfd,buf,sizeof(buf)-1,0);if(ret<=0){break;}printf("get %d bytes of normal data:%s\n",ret,buf);}else if(FD_ISSET(connfd,&exception_fds)){ret=recv(connfd,buf,sizeof(buf)-1,MSG_OOB);if(ret<=0){break;}printf("get %d bytes of oob data:%s\n",ret,buf);}}close(connfd);close(listenfd);return 0;}

,那么,不如我们礼貌地保持相对距离,不至于太冷,不至于太痛。

Linux下同时接受普通数据和带外数据

相关文章:

你感兴趣的文章:

标签云: