基本套接字编程
来源:互联网 发布:零基础编程入门 编辑:程序博客网 时间:2024/05/19 21:42
《UNP》第4到第5章讲解了基本的TCP套接字编程。先介绍了各类套接字的地址结构,然后详述了各个API。
先介绍了一个迭代服务器,但是迭代服务器性能有限,所以提供了一个并发服务器。但是并发服务器需要用信号机制处理结束的子进程,并且会带来中断慢系统调用的问题。
再升级一下,可以预先派生子进程,可以用线程替代进程,可以把服务器改造为守护进程等等。
#ifndef UTILS_H#define UTILS_H#include <sys/socket.h>#include <netinet/in.h>#include <strings.h>#include <arpa/inet.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>//typedef void waitSon(int);//注册信号处理程序,需要提供信号和函数指针。void (*waitSon(int signo, void (*func)(int)))(int);//建立一个TCP连接,成功返回套接字描述符;失败返回-1.int tcp_connect(const char *addr, const char *port);//成功则返回一个监听套接字;否则返回-1.int tcp_listen(const char *port, int backlog);//建立一个TCP连接,成功返回套接字描述符;失败返回-1.int tcp_connect(const char *addr, const char *port){ int sockfd; struct sockaddr_in svraddr; bzero(&svraddr, sizeof(svraddr)); svraddr.sin_family = AF_INET; svraddr.sin_port = htons(atoi(port)); inet_pton(AF_INET, addr, &svraddr.sin_addr); if( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { write(2, "socket error\n", 13); return -1; } if(connect(sockfd, (struct sockaddr*) &svraddr, sizeof(svraddr)) == 0) return sockfd; else { write(2, "connect error\n", 14); return -1; }}//成功则返回一个监听套接字;否则返回-1.int tcp_listen(const char *port, int backlog){ int listenfd; struct sockaddr_in svraddr; bzero(&svraddr, sizeof(svraddr)); svraddr.sin_family = AF_INET; svraddr.sin_port = htons(atoi(port)); svraddr.sin_addr.s_addr = htonl(INADDR_ANY); if( (listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { write(2, "socket error\n", 13); return -1; } if( bind(listenfd, (struct sockaddr*)&svraddr, sizeof(svraddr)) < 0) { write(2, "bind error\n", 11); return -1; } if(listen(listenfd, backlog) < 0) { write(2, "listen error\n", 13); return -1; } return listenfd;}//注册信号处理程序,需要提供信号和函数指针。void (*waitSon(int signo, void (*func)(int)))(int){ struct sigaction act,oact;//oact = oldact act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; act.sa_flags |= SA_RESTART; if( sigaction(signo, &act, &oact) < 0 ) return SIG_ERR; else return oact.sa_handler;}#endif
0 0
- 基本套接字编程
- 基本套接字编程
- 基本TCP套接字编程
- 基本套接字编程API
- 基本tcp套接字编程
- 基本UDP套接字编程
- 基本TCP套接字编程
- 基本TCP套接字编程
- 基本TCP套接字编程
- 基本UDP套接字编程
- 基本TCP套接字编程
- 基本TCP套接字编程
- 基本TCP套接字编程
- 基本UDP套接字编程
- TCP基本套接字编程
- 基本UDP套接字编程
- 基本TCP套接字编程
- 基本TCP套接字编程
- 字符串转成数字
- 与众不同的家装!超有创意的种植“壁画”
- 指向函数的指针
- Stanford 机器学习 Week4 作业 Multi-class Classification and Neural Networks
- 抽象类和接口的区别
- 基本套接字编程
- Android edittext输入图片
- mac下面用哪种远程控制,vnc还是teamViewer
- Google USB Driver
- 计算机网络性能
- COM中的OLECHAR ,BSTR和CComBSTR 的理解和应用
- 图片模糊化编程(毛玻璃效果)
- YII2
- iOS 原生二维码扫描