博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程服务器基础模型三(多线程模型)
阅读量:6945 次
发布时间:2019-06-27

本文共 3380 字,大约阅读时间需要 11 分钟。

  hot3.png

#include stdio.h>#include unistd.h>#include sys/socket.h>#include netinet/in.h>#include errno.h>#include signal.h>#include sys/wait.h>#include sys/types.h>#include string.h>#include stdlib.h>#include pthread.h>#define SERV_PORT 5358#define MAX_CONN 10#define BUF_LEN 1024ssize_t readn(int fd, void *vptr, size_t n){    ssize_t nread;    size_t nleft;    char *ptr;    ptr = vptr;    nleft = n;    while(nleft > 0)    {        nread = read(fd, ptr, nleft);        if(nread != 0 )        {            if(errno == EINTR){        /*interrupt by signal*/                nread = 0;            }            else            {                return -1;            }        }        else if(nread == 0)        {        /*EOF*/             break;        }        nleft -= nread;        ptr += nread;    }    return (n-nleft);}ssize_t writen(int fd, const void *vptr, size_t n){    size_t nleft;    ssize_t nwriten;    const char *ptr;    ptr = vptr;    nleft = n;    while(nleft > 0) {        nwriten = write(fd, ptr, nleft)        if(nwriten == 0)         {            if(nwriten 0 && errno == EINTR)             {                nwriten = 0;        /*interrupt by signal*/            }             else             {                return -1;            }        }        nleft -= nwriten;        ptr += nwriten;    }    return n;}void str_echo(int sockfd){    ssize_t nread;    char buf[BUF_LEN] = {0};    while(1)     {        bzero(buf, BUF_LEN);        if((nread = read(sockfd, buf, BUF_LEN)) == -1)         {            if(errno == EINTR)             {                continue;            }            else             {                printf("readn error: %s\n", strerror(errno));                continue;            }        }        else if (nread == 0)         {            break;        }        else         {            fputs(buf, stdout);            write(sockfd, buf, nread);        }    } }void *thread_func(void *arg){    int connfd;    connfd = *((int *)arg);    free(arg);    pthread_detach(pthread_self());    str_echo(connfd);    close(connfd);    return NULL;}int main(int argc, char **argv){    int listenfd, *connfdptr;    socklen_t cliaddrlen;    pthread_t tid;    struct sockaddr_in servaddr, cliaddr;    if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){           printf("socket error: %s\n", strerror(errno));           return 0;    }    bzero(&servaddr, sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    servaddr.sin_port = htons(SERV_PORT);    if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){           printf("bind error: %s\n", strerror(errno));           return 0;    }    if(listen(listenfd, MAX_CONN) == -1){           printf("listen error: %s\n", strerror(errno));           return 0;    }    //cliaddr = (struct sockaddr *)malloc(sizeof(struct sockaddr));    while(1){           cliaddrlen = sizeof(cliaddr);           connfdptr = malloc(sizeof(int));           if((*connfdptr = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen)) == -1){             if(errno == EINTR){                continue;             }             else{                printf("accept error: %s\n", strerror(errno));                continue;             }           }           pthread_create(&tid, NULL, thread_func, connfdptr);    }}

转载于:https://my.oschina.net/sanpeterguo/blog/140481

你可能感兴趣的文章
浏览器对象BOM模型开发示意图分析(应用设计)
查看>>
磁盘IOPS计算与测量
查看>>
以色列网络安全行业崛起的秘密
查看>>
分层设计与分层测试
查看>>
全球大数据和业务分析收入预计到2019年突破1870亿美元
查看>>
删除管理员权限可屏蔽96%的 Windows 漏洞
查看>>
Xen 漏洞曝光
查看>>
《数据科学:R语言实现》——3.3 转换数据类型
查看>>
《MATLAB智能算法超级学习手册》一一2.2 种群竞争模型的讨论
查看>>
《海外社交媒体营销》一一1.3 海外社交媒体营销的技巧
查看>>
测试并发应用 (一)监控Lock接口
查看>>
《众妙之门——网页设计专业之道》——2.2 上下文精确导航
查看>>
《SOA与REST:用REST构建企业级SOA解决方案》—第2章2.2节案例研究背景之一:中西部大学联盟(MUA)...
查看>>
【转】SQL Server 的三种自定义函数(用户定义的函数)
查看>>
监听器如何获取Spring配置文件
查看>>
SQL递归查询实例
查看>>
感叹人生(瞎写的)
查看>>
HTML_5 Canvas(1)
查看>>
如何避免虚拟基础设施单点故障
查看>>
mysql创建存储过程
查看>>