经过小小改动,把前面基础的例子做出一点修改。

并发服务器,服务器每accept一个请求就fork()一个新的子进程。

编译运行方法同前一篇。

/*client_tcp.c*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <netinet/in.h>

#define MAXLINE 4096
#define PORT 12345

void process(FILE *fp, int sockfd)
{
    char send[MAXLINE], recv[MAXLINE];
    while (fgets(send, MAXLINE, fp) != NULL) {
        write(sockfd, send, strlen(send));
        int n = read(sockfd, recv, MAXLINE);
        recv[n] = ;
        fputs(recv, stdout);
    }
}

int main(int argc, char *argv[])
{
    int sockfd, n;
    ];
    struct sockaddr_in servaddr;

    ) {
        fprintf(stderr, "usage: client_tcp <IP>\n");
        exit();
    }

    )) < ) {
        fprintf(stderr, "socket error\n");
        exit();
    }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    ], &servaddr.sin_addr) <= ) {
        fprintf(stderr, ]);
        exit();
    }

    if (connect(sockfd, (struct sockaddr *) &servaddr,
            ) {
        fprintf(stderr, "connect error\n");
        exit();
    }

    process(stdin, sockfd);

    exit();
}
/*server_tcp.c*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>

#define MAXLINE 4096
#define    LISTENQ 1024
#define PORT 12345

void process(int sockfd)
{
    ssize_t n;
    ];

    ) {
        write(sockfd, buff, n);
    }
}

int main(int argc, char *argv[])
{
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    pid_t pid;

    listenfd = socket(AF_INET, SOCK_STREAM, );

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);

    bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    listen(listenfd, LISTENQ);

    ) {
        int clilen = sizeof(cliaddr);
        connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);

        ) {//child
            close(listenfd);
            process(connfd);
            exit();
        }
        close(connfd);
    }

    exit();
}

《UNIX网络编程》TCP客户端服务器:并发、消息回显的更多相关文章

  1. 《UNIX网络编程》UDP客户端服务器:消息回显

    udp写的程序相比tcp简单一些,在socket()与bind()之后,不需要connect(),accept()等步骤,直接简化为了sendto()与recvfrom(). 编译运行同前面的tcp. ...

  2. UNIX网络编程---TCP客户/服务器程序示例(五)

    一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...

  3. [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]

    [网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...

  4. UNIX网络编程——select函数的并发限制和 poll 函数应用举例

    一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置,  ...

  5. UNIX网络编程——TCP回射服务器/客户端程序

    下面通过最简单的客户端/服务器程序的实例来学习socket API. serv.c 程序的功能是从客户端读取字符然后直接回射回去: #include<stdio.h> #include&l ...

  6. UNIX网络编程——tcp流协议产生的粘包问题和解决方案

    我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...

  7. unix网络编程——TCP套接字编程

    TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...

  8. Linux网络编程:客户端/服务器的简单实现

    一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...

  9. 第5章-unix网络编程 TCP/服务端程序示例

    这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的  客户端代码 #include "unp. ...

  10. python网络编程--TCP客户端的开发

    #导入socket模块 2 import socket 3 #参数说明 4 """ 5 socket类的介绍 6 创建客户端socket对象 7 socket.socke ...

随机推荐

  1. 个人的IDE制作(vim)——适用于C++/C

    引用文章A:http://learnvimscriptthehardway.onefloweroneworld.com/ 引用介绍:初学者建议通读一遍.对VIM能有整体性的了解. 引用文章B:http ...

  2. 第一个XAML程序

    创建win8程序的默认Xaml文件是MainPage.Xaml文件,文件的内容如下所示: <Page x:Class="App1.MainPage" xmlns=" ...

  3. Yii中常用路径(转)

    调用YII框架中jquery:Yii::app()->clientScript->registerCoreScript('jquery');    framework/web/js/sou ...

  4. oracle中的rowid和数据行的结构

    在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行 ...

  5. AngularJS中serivce,factory,provider的区别

    一.service引导 刚开始学习Angular的时候,经常被误解和被初学者问到的组件是 service(), factory(), 和 provide()这几个方法之间的差别.This is whe ...

  6. 用纯CSS3绘制萌系漫画人物动态头像

    大家已经见惯了用CSS3画的图标.LOGO.头像,这次台湾同学Rei给我们带来了用纯CSS3绘制的日本动漫<轻音少女>女主角秋山澪的动态头像.看到动图我震惊了!!!CSS3的强大再次霸气测 ...

  7. mvc of js

    http://alexatnet.com/articles/model-view-controller-mvc-javascript The article demonstrates how to a ...

  8. 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件(转载)

    原文参考:http://blog.csdn.net/gaoshanwudi/article/details/7355794 初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数 ...

  9. Linux下多核环境Erlang的SMP測试

    目标 (1)       了解在多核cpu环境下,erlang并发进程调度对各个cpu核负载的影响: (2)       Erlang虚拟机的内存添加机理: (3)       Erlang进程的调度 ...

  10. android同时使用多个library时的问题

    剧情是这样,我的app要使用四个library,如:LibraryA,LibraryB.这两个库又都需要support.v4.jar. 由于加载的时间不同,所以四个support.v4.jar不同,出 ...