《unix网络编程》(19)使用select的TCP和UDP回射程序
来源:互联网 发布:mac dock栏动态效果 编辑:程序博客网 时间:2024/04/28 00:53
TCP和UDP服务器端程序
注意:信号处理函数可能中断对select的调用,因此要处理EINTR错误
//udpservselect01.c#include "myheader.h"void str_echo(int sockfd) { ssize_t n; char buf[MAXLINE];again: while (( n = read(sockfd, buf, MAXLINE)) > 0) Writen(sockfd, buf, n); if (n < 0 && errno == EINTR) goto again; else if (n < 0) { err_exit("str_echo: read error."); }}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 onSignalCatch(int); listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); //设置SO_REUSEADDR套接字以防该端口上已经有连接 Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); Bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); //以下创建UDP套接字并绑定与TCP套接字相同的端口。这里无须设置SO_REUSEADDR //因为TCP端口独立于UDP端口 udpfd = Socket(AF_INET, SOCK_DGRAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); Bind(udpfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); //处理SIGCHLD信号,因为TCP连接由子进程处理 Signal(SIGCHLD, onSignalCatch); FD_ZERO(&rset); //计算等待的描述符中较大的 int maxfd = listenfd > udpfd ? listenfd : udpfd; maxfdp1 = maxfd + 1; for( ; ; ) { //调用select等待监听TCP或UDP套接字变为可读 FD_SET(listenfd, &rset); FD_SET(udpfd, &rset); if ((nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) { //信号处理函数可能中断对select的调用,因此要处理EINTR错误 if (errno == EINTR)continue; elseerr_exit("select error\n"); } if (FD_ISSET(udpfd, &rset)) { len = sizeof(cliaddr); n = Recvfrom(udpfd, mesg, MAXLINE, 0, (struct sockaddr*)&cliaddr, &len); Sendto(udpfd, mesg, n, 0, (struct sockaddr*)&cliaddr, len); } if (FD_ISSET(listenfd, &rset)) { len = sizeof(cliaddr); connfd = Accept(listenfd, (struct sockaddr*)&cliaddr, &len); if ((childpid = Fork()) == 0) { //child process Close(listenfd); //close listening socketstr_echo(connfd); //process the requestexit(0); } Close(connfd); //parent closes connected socket } }}客户端程序分别使用:tcpcliselect.c 和udpcli01.c
程序运行结果
服务器端:tcp客户端进程中断了一次
tcp客户端:
udp客户端:
完整源码
http://download.csdn.net/download/u013074465/8602301
0 0
- 《unix网络编程》(19)使用select的TCP和UDP回射程序
- (unix网络编程)tcp回射程序三:多路复用
- UNIX网络编程——使用select函数的TCP和UDP回射服务器程序
- UNIX网络编程笔记(7):回射程序的UDP版本
- (unix网络编程)tcp回射程序一:基本实现
- (unix网络编程)tcp回射程序二:避免僵尸进程
- UNIX网络编程笔记(4):简单的回射程序
- unix 网络编程---select回射TCP,UDP
- 《unix网络编程》(18)基本UDP套接字 简单客户服务器回射程序及改进
- 网络编程学习笔记(使用select函数的TCP和UDP回射服务器程序)
- UNIX网络编程学习(15)--使用单进程和select的TCP服务器程序
- UNIX网络编程之第二步之嚼烂基本TCP套接字编程(以简单的TCP客户/服务器回射程序为例)
- 网络编程之UDP简单回射程序
- TCP网络编程之echo回射程序
- tcp客户/服务器回射程序之四-----select函数的使用
- TCP回射程序(I/O复用 select)
- UDP回射程序
- 19、网络编程(TCP和UDP)
- 快排实现
- C++虚拟继承例子
- javascript接收二维数组并在echarts中画图
- Hadoop伪分布式安装与配置
- DNS BIND之dnssec安全介绍
- 《unix网络编程》(19)使用select的TCP和UDP回射程序
- 黑马程序员_日记55_TreeSet、泛型限定和比较器限定方式的综合运用方式
- Tomcat7部署项目的四种方法
- Linux Kernel and Android 休眠与唤醒
- ios 取到button的文字位置
- MFC - 复制内容到剪切板
- Codeforces Round #139 (Div. 2)C Barcode DP
- 贪心练习——肥鼠的交易
- c语言基础类型