同时使用tcp和udp回射服务器
来源:互联网 发布:淘宝直播买翡翠靠谱吗 编辑:程序博客网 时间:2024/05/15 05:39
同时使用select函数的tcp和udp回射服务器:
#include <iostream>#include <sys/socket.h>#include <sys/types.h>#include <strings.h>#include <arpa/inet.h>#include <unistd.h>#include <signal.h>#include <stdlib.h>#include <errno.h>#include <sys/types.h>#include <sys/wait.h>using namespace std;#define MAXLINE 1024#define SERV_PORT 29988 //server使用的本地端口#define LISTENQ 100 //listen侦听队列最大数typedef struct sockaddr SA;void sig_chld(int signo) { pid_t pid; int stat; //使用waitpid回收子进程 while((pid=waitpid(-1,&stat,WNOHANG))>0){ cout << "child " << pid << " terminated." << endl; } return ;}void str_echo(int sockfd) { ssize_t n; char buf[MAXLINE]; again: while((n=read(sockfd,buf,MAXLINE))>0){ write(sockfd,buf,n); } //如果errno为EINTR,表示被信号中断的系统调用,可以重入,应该重新调用 if(n<0 && errno==EINTR){ goto again; } else { cout << "str_echo read error." << endl; exit(-1); }}int main(int argc , char** argv) { int listenfd,connfd,udpfd,nready,maxfdp1; char mesg[MAXLINE]; pid_t childpid; fd_set rset; ssize_t n; socklen_t len; const int on = 1; struct sockaddr_in cliaddr,servaddr; void sig_chld(int); //创建TCP本地套接字,指定端口,地址任意选取本地接口 listenfd = socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr = htonl(0); servaddr.sin_port=htons(SERV_PORT); //设置套接字端口可以重入 setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //绑定一个本地套接字地址 bind(listenfd,(SA*)&servaddr,sizeof(servaddr)); //侦听本地套接字,最大排队数量为LISTENQ listen(listenfd,LISTENQ); //创建本地UDP套接字 udpfd = socket(AF_INET,SOCK_DGRAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=htonl(0); servaddr.sin_port = htons(SERV_PORT); //绑定一个本地套接字地址 bind(udpfd,(SA*)&servaddr,sizeof(servaddr)); //注册信号SIGCHLD,回收fork子进程 signal(SIGCHLD,sig_chld); FD_ZERO(&rset); maxfdp1 = max(listenfd,udpfd) +1; for(;;){ //添加侦听套接字listenfd和本地udp套接字到select可读集合 FD_SET(listenfd,&rset); FD_SET(udpfd,&rset); //使用select判断是否可以读 if((nready = select(maxfdp1,&rset,NULL,NULL,NULL)<0)){ if(errno == EINTR){ continue; } else { cout << "select error ." << endl; exit(-1); } } //检测listenfd if(FD_ISSET(listenfd,&rset)){ len = sizeof(cliaddr); connfd = accept(listenfd,(SA*)&cliaddr,&len); //创建子进程,实现并发服务器 if((childpid=fork())==0){ close(listenfd); str_echo(connfd); exit(0); } close(connfd); } //检测udpfd if(FD_ISSET(udpfd,&rset)){ len=sizeof(cliaddr); n=recvfrom(udpfd,mesg,MAXLINE,0,(SA*)&cliaddr,&len); sendto(udpfd,mesg,n,0,(SA*)&cliaddr,len); } } return 0;}
0 0
- 同时使用tcp和udp回射服务器
- Linux下使用epoll函数同时处理TCP请求和UDP请求的回射服务器
- 第九章 TCP和UDP同时用复用一个端口实现一个回射服务器
- linux C++ 同时监听多个端口 同时处理TCP和UDP服务请求的回射服务器
- DNS同时使用TCP和UDP?
- 游戏服务器使用TCP和UDP
- UNIX网络编程——使用select函数的TCP和UDP回射服务器程序
- 使用select函数的TCP和UDP回射服务器程序
- 使用select函数的TCP和UDP回射服务器程序
- 网络编程学习笔记(使用select函数的TCP和UDP回射服务器程序)
- linux高性能服务器编程之同时处理UDP请求和TCP请求的服务器
- linux下搭建能同时接收UDP和TCP连接的socket并发多线程服务器
- epoll高级应用之同时处理 tcp/udp 的服务器
- 并发TCP服务器和并发UDP服务器
- Linux网络编程--使用epoll模型同时处理tcp和udp服务
- Linux网络编程--使用epoll模型同时处理tcp和udp服务
- select函数在TCP和UDP回射服务器中的应用
- 游戏服务器:到底使用UDP还是TCP
- ubuntu16.04 更行flashplayer 插件
- NYOJ204coin text
- package-info.java文件解读
- 循环输出数据到页面
- 利用Messenger跨进程通信
- 同时使用tcp和udp回射服务器
- IntelliJ IDEA 15 配置 Tomcat8
- [CTBS]许可证过期之激活
- POJ 3421 X-factor Chains (整数分解+组合数)
- 【Qt】标准int类型输入对话框
- 不规则多边形区域的面积计算算法
- ACM天梯赛 L3-001. 凑零钱
- 一点想法
- netgarage攻略 -- level1~1evel4