基本套接字编程

来源:互联网 发布:零基础编程入门 编辑:程序博客网 时间: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
原创粉丝点击