最近学习unix网络编程,感觉东西零零碎碎,比较混乱。因此决定整理以下,发一个小博客。一来可以与大家分享以下,二来可以总结提高一下所学的东西。话说:竹子为什么长的高,因为它喜欢总结阿~~^_^
废话不多说了,上代码。小弟半路出家,入行不深,过路大神不喜勿喷阿,嘿嘿~~^_^
程序是一个基于tcp的 C/S .简单回显功能( 声明以下,不要以为注释是英语就说我是在哪里下载的,原因是我运行程序 汉字老显示乱码,就改成蹩脚英语了 )。
首先是一个自己的库
1 #ifndef MYLIB_H 2 #define MYLIB_H 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <netinet/in.h> 7 #include <sys/socket.h> 8 #include <arpa/inet.h> 9 #include <unistd.h> 10 #include <string.h> 11 #include <errno.h> 12 #include <signal.h> 13 #include <sys/wait.h> 14 15 #define LISTENQ 1024 16 #define MAXLINE 1460 17 #define SERV_PORT 9877 18 19 typedef void (*SignalFunc)(int); 20 21 SignalFunc signal(int sigNo,SignalFunc fun); 22 void sig_chld(int sigNo); 23 void sys_err(char *pa); 24 25 #endif // MYLIB_H |
这些是需要的头文件和一些宏定义,服务端和客户端都需要,我都把他们搞一块儿了,这样方便,叫mylib.h 。
哦,先大致解释一下:
1、signal 这个函数是用来捕获信号的。后边服务端会用到,在服务端在细说
2、sig_chld 是signal捕获到信号后的处理函数
3、sys_err 用来输出提示,并退出进程
下边是头文件里函数的实现,里边的函数如果没看太懂可以先不用理解,后边会细说,哈哈
1 #include <mylib.h> 2 3 void sys_err(char *pa) 4 { 5 printf("%s",pa); 6 exit(1); 7 } 8 9 SignalFunc signal(int sigNo, SignalFunc fun){ 10 struct sigaction act , oact; 11 act.sa_handler=fun; 12 sigemptyset(&act.sa_mask); //Additional set of signals to be blocked. 13 act.sa_flags=0; 14 if(sigaction(sigNo,&act,&oact)<0) 15 return SIG_ERR; 16 return oact.sa_handler; 17 } 18 19 void sig_chld(int sigNo) 20 { 21 pid_t pid; 22 int state; 23 while ((pid=waitpid(-1,&state,WNOHANG))>0) { 24 printf("process %d terminated \n",pid); 25 } 26 return; 27 } |