UNIX网络编程(第三版 ) 测试代码 7.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);
}

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

时间: 2024-10-10 09:05:13

UNIX网络编程(第三版 ) 测试代码 7.2的相关文章

【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O复用适用于以下场合: (1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用 (2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现 (3) 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用 (4) 如果一个服务器既要适用TCP,

Unix网络编程第三版源码编译

配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版本是否匹配.编译器.库文件.头文件以及结构体定义等等) checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for

unix网络编程第三版源代码ubuntu下配置的问题解决

第一步:首先下载本书配套的源码unpv13e.tar.gz 第二步:解压后进入根文件夹有一个README 4 Execute the following from the src/ directory: 5 6 ./configure # try to figure out all implementation differences 7 8 cd lib # build the basic library that all programs need 9 make # use "gmake&q

【UNIX网络编程(三)】TCP客户/服务器程序示例

上一节给出了TCP网络编程的函数,这一节使用那些基本函数编写一个完成的TCP客户/服务器程序示例. 该例子执行的步骤如下: 1.客户从标准输入读入一行文本,并写给服务器. 2.服务器从网络输入读入这行文本,并回射给客户. 3.客户从网络输入读入这行回射文本,并显示在标准输出上. 用图描述如下: 编写TCP回射服务器程序如下: #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <st

python 网络编程第三版

为服务端增加多线程解决方案 1.服务端代码如下: ***这个版本并没有真正的起到多线程的作用,主要原因在于t.join():以后的版本会改进这个问题*** #!/usr/bin/python #!coding:utf-8 import os,sys,time from socket import * import threading def handleClient(conn): print '[info] handleClient is :{0}'.format(os.getpid()) wh

unix网络编程代码(2)

继续贴<unix网络编程>上的示例代码.这次是一个反射程序,反射是客户端讲用户输入的文本发送到服务器端,服务器端读取客户端发过来的文本消息,然后原封不动的把文本消息返回给客户端.使用tcp协议连接客户端和服务端,我已经在我的阿里云服务器上测试过了,能够完美运行. 首先是头文件wrap.h,在该头文件中,声明了封装部分网络编程套接字api的包裹函数,以及某些宏定义. 1 #ifndef WRAP_H_ 2 #define WRAP_H_ 3 4 #include <stdio.h>

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

《unix环境高级编程&#183;第三版》源代码编译及使用

<unix环境高级编程·第三版>源代码编译及使用 <unix环境高级编程>中有很多示例代码需要包含作者自定义的头文件,如"apue.h".这些代码可以从以下网址下载 http://apuebook.com/code3e.html 1. 解压文件 tar -zxvf src.3e.tar.gz 2. 安装libbsd-dev,否则编译会报错不通过,会提示编译threads文件夹里面的内容时报错 3. cd apue.3e make 用 root 用户或者 sudo

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指