文档章节

UNIX网络编程(第三版 ) 测试代码 7.3

面码
 面码
发布于 2014/08/15 11:31
字数 442
阅读 101
收藏 2

头文件

#ifndef UNP_H_
#define UNP_H_
/**
 * @file unp.h 
 * @brief  global structure for unp
 * @author mhw
 * @copyright galaxywind
 * @date 2013/11/06
 * @note
 *      
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <errno.h>


#define SERVER_PORT 8899
#define MAX_LISTEN  10
#define MAXN        1024



#endif

服务端

#include "unp.h"

void str_echo(int sockfd){
    int  n;
    char buf[MAXN];
again:
    while( (n = read(sockfd, buf, MAXN) )> 0)
            write(sockfd, buf, MAXN);
    if(n < 0 && errno == EINTR)
            goto again;
    if(n < 0)
            strerror(errno);
    sleep(1);
    fprintf(stderr, "close client\n");
    close(sockfd); 
    return;
}

int main(int argc, char **argv)
{
    int listen_fd;
    int conn_fd;
    pid_t child_fd;
    socklen_t client_len;
    struct sockaddr_in server_addr, client_addr;
    char   client_str[INET_ADDRSTRLEN];
    memset( (void *)&server_addr, 0, sizeof(struct sockaddr_in));
    memset( (void *)&client_addr, 0, sizeof(struct sockaddr_in));
    memset( (void *)client_str,   0, sizeof(client_str));
    
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);

    server_addr.sin_family      = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port        = htons(SERVER_PORT);

    bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    listen(listen_fd, MAX_LISTEN);

    while(1){
            conn_fd = accept( listen_fd, (struct sockaddr*)&client_addr, &client_len);
            child_fd = fork();
            if(child_fd == 0){
                    close(listen_fd);
                    str_echo(conn_fd);
                    exit(0);
            }
            inet_ntop(AF_INET, (void *)&client_addr, client_str, INET_ADDRSTRLEN);
            fprintf(stderr, "conn_fd from %s\n", client_str);
            close(conn_fd); 
            memset( (void *)&client_addr, 0, sizeof(struct sockaddr_in));
            memset( (void *)client_str,   0, sizeof(client_str));
    }
    return 0;
}

客服端

#include "unp.h"

void str_cli(FILE *fp, int conn_fd){
    char buf[MAXN];
    char *ptr;
again:
    while( (ptr  = fgets(buf, MAXN, fp)) != NULL){
        write(conn_fd,buf, MAXN);
        read(conn_fd, buf, MAXN);
        fputs(buf, stdout);
    }
    if(errno == EINTR)
            goto again;
    if(!ptr){
            fprintf(stderr, "read EOF\n");
    }
    if( EWOULDBLOCK == close(conn_fd)){
        fprintf(stderr, "get fin from server timeout\n");
    }else{
        fprintf(stderr, "success\n");
    }
}

int main(int argc, char **argv)
{
    int conn_fd;
    struct linger ling;
    socklen_t size;
    struct sockaddr_in server_addr;
    if(argc != 2 && argc != 3){
        fprintf(stderr, "server address needed\n");
        return -1;
    }

    memset( (void *)&server_addr, 0, sizeof(struct sockaddr_in));

    conn_fd = socket(AF_INET, SOCK_STREAM, 0);
    inet_pton(AF_INET, argv[1], (void*)&server_addr);
    server_addr.sin_family      = AF_INET;
    server_addr.sin_port        = htons(SERVER_PORT);

    if(argc == 3){
            ling.l_onoff  = 1;
            ling.l_linger = atoi(argv[1]);
            size          = sizeof(ling);
            if( getsockopt(conn_fd, SOL_SOCKET, SO_LINGER, &ling, &size) < 0){
                    fprintf(stderr, "set linger fail\n");
            }else{
                    fprintf(stderr, "set linger success\n");
            }
    }
    
    if ( connect(conn_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
            fprintf(stderr, "connect fail to server %s\n", argv[1]);
            exit(0);
    }
    str_cli(stdin, conn_fd);
    exit(0);
}


© 著作权归作者所有

面码
粉丝 26
博文 293
码字总数 72288
作品 0
成都
程序员
私信 提问
所看书籍记录

《程序员教程(第三版)》 《深入理解计算机系统》 《程序员的自我修养--链接、装载与库》(两遍) 《编译原理(龙书)》 《现代操作系统(第三版)》 《图解网络硬件》 《图解TCP/IP》 《数据...

thanatos_y
2016/03/14
104
0
Vim 7.3 e 发布,Linux 控制台文本编辑器

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。 Vim 刚刚发布了Vim 7.3...

红薯
2010/08/10
2K
1
Linux运维人员成长之路必学书籍资料推荐

对于从事或者即将从事Linux运维的童鞋来说,学习书籍和视频课程两者缺一不可,当然最重要的是要付诸于实践。今天为大家推荐一些不错的书籍与学习课程,,希望对对大家有帮助:http://edu.51ct...

让往事随风
2016/06/13
280
0
这些计算机经典书,如果你没读过不合适

教育就是当一个人把在学校所学全部忘光之后剩下的东西。 ——阿尔伯特•爱因斯坦 软件开发的世界是不断变化的。每一天都会有一门新的技术出现,昨天你学到的东西今天可能就毫无意义了。 在这...

异步社区
2018/09/03
0
0
FreeBSD 7.3-BETA1 发布

FreeBSD是一份UNIX操作系统,它面向i386、IA-64、PC-98、Alpha/AXP及UltraSPARC平台。它基于加州伯克利大学 的4.4 BSD-Lite发布,并带有一些4.4 BSD-Lite2增强。它还非直接地基于William Jol...

小编辑
2010/01/30
306
0

没有更多内容

加载失败,请刷新页面

加载更多

获取map()以在Python 3.x中返回列表

我正在尝试将列表映射为十六进制,然后在其他地方使用该列表。 在python 2.6中,这很简单: 答: Python 2.6: >>> map(chr, [66, 53, 0, 94])['B', '5', '\x00', '^'] 但是,在Python 3.......

技术盛宴
7分钟前
4
0
基于TI达芬奇系列TMS320DM8148浮点DSP C674xBOOT SET启动选择开关、Micro SD接口

说明 由广州创龙设计的SOM-TL8148和SOM-TL8127核心板是Pin To Pin兼容,两款核心板公用同一块底板。DM8148与DM8127相比,DM8148有SATA接口,DM8127没有SATA接口;而DM8127有CSI2接口,DM814...

Tronlong创龙
10分钟前
4
0
产品经理如何有效进行需求管理?

需求是整个软件项目当中最重要一项输入。软件开发和传统生产行业最大的区别在于,需求总是模糊的、主观的和随时变化的。相对于电子产品、汽车等制造行业有形的硬件需求,软件开发的需求的描述...

Worktile
23分钟前
2
0
Python 判断变量是否是 None 的三种写法

代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是if x is None; 第二种是 if not x:; 第三种是if not x is None(这句这样理解更清晰if not (x is None)) 。 如果你觉得...

每天学Python
26分钟前
2
0
springboot初探——启动流程

前面已经介绍一下springboot,本篇开始介绍springboot在启动过程中做了什么,凭什么那么少的代码就能完成一个web项目。 其他的我们可以先不管,先来看一眼springboot的main方法 @SpringBootA...

计算机狼
45分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部