博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX网络编程(第三版 ) 测试代码 7.2
阅读量:6609 次
发布时间:2019-06-24

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

hot3.png

#ifndef UNP_H_#define UNP_H_/** * @file unp.h * @brief  global structure for unp * @author xiyanxiyan10 * @TODO   处理覆盖不全缺乏安全性,测试使用 * */#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define SERVER_PORT 8899#define MAX_LISTEN  10#define MAXN        1024typedef unsigned int size_t;typedef signed   int ssize_t;#endif

server

#include "unp.h"void str_echo(int sockfd){    ssize_t 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);    if(n == 0)            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;}

client

#include "unp.h"void print_mss(int connfd){    int mss;    socklen_t size = sizeof(mss);    if( getsockopt(connfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &size) < 0){        fprintf(stderr, "get mss fail\n");    }else{        fprintf(stderr, "get mss success %u\n", mss);    }}void str_cli(FILE *fp, int conn_fd){    char buf[MAXN];    while( fgets(buf, MAXN, fp) != NULL){        write(conn_fd,buf, MAXN);        read(conn_fd, buf, MAXN);        fputs(buf, stdout);        print_mss(conn_fd);    }}int main(int argc, char **argv){    int conn_fd;    struct sockaddr_in server_addr;    if(argc != 2){        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 ( 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);}

转载于:https://my.oschina.net/u/572632/blog/301072

你可能感兴趣的文章
Linux Shell文件差集
查看>>
eclipse中如何去除警告:Class is a raw type. References to generic type Class<T> should be parameterized...
查看>>
Gradle脚本基础全攻略
查看>>
Django模版中的过滤器详细解析 Django filter大全
查看>>
Linux中使用pwconv实现passwd中密码到shadow
查看>>
MongoDB C++ gridfs worked example
查看>>
Visual Studio 2017各版本安装包离线下载
查看>>
C#线程安全的那些事
查看>>
Mysql报错......\xE6\x80\xBB\xE7\x9B\x91' for column...
查看>>
【论文笔记】Social Role-Aware Emotion Contagion in Image Social Networks
查看>>
rpm安装PostgreSQL
查看>>
k sum(lintcode)
查看>>
28. extjs中Ext.BLANK_IMAGE_URL的作用
查看>>
Hibernate注解配置N:N关联
查看>>
Android 控件属性
查看>>
java进程卡死问题
查看>>
【244】◀▶IEW-Unit09
查看>>
处理有外键约束的数据
查看>>
par函数的xaxt函数-控制x轴刻度的显示
查看>>
Unity5.1 新的网络引擎UNET(十五) Networking 引用--中
查看>>