《UNIX网络编程》TCP客户端服务器:并发、消息回显
经过小小改动,把前面基础的例子做出一点修改。
并发服务器,服务器每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客户端服务器:并发、消息回显的更多相关文章
- 《UNIX网络编程》UDP客户端服务器:消息回显
udp写的程序相比tcp简单一些,在socket()与bind()之后,不需要connect(),accept()等步骤,直接简化为了sendto()与recvfrom(). 编译运行同前面的tcp. ...
- UNIX网络编程---TCP客户/服务器程序示例(五)
一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...
- [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]
[网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...
- UNIX网络编程——select函数的并发限制和 poll 函数应用举例
一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n来调整或者使用setrlimit函数设置, ...
- UNIX网络编程——TCP回射服务器/客户端程序
下面通过最简单的客户端/服务器程序的实例来学习socket API. serv.c 程序的功能是从客户端读取字符然后直接回射回去: #include<stdio.h> #include&l ...
- UNIX网络编程——tcp流协议产生的粘包问题和解决方案
我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...
- unix网络编程——TCP套接字编程
TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...
- Linux网络编程:客户端/服务器的简单实现
一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...
- 第5章-unix网络编程 TCP/服务端程序示例
这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码 #include "unp. ...
- python网络编程--TCP客户端的开发
#导入socket模块 2 import socket 3 #参数说明 4 """ 5 socket类的介绍 6 创建客户端socket对象 7 socket.socke ...
随机推荐
- HDU 1151 - Air Raid
很明显求最小路径覆盖 就是求最大匹配 #include <iostream> #include <cstdio> #include <cstring> #inclu ...
- [转载]vs2010中臃肿的ipch和sdf文件
使用VS2010建立C++解决方案时,会生成SolutionName.sdf和一个叫做ipch的文件夹,这两个文件再加上*.pch等文件使得工程变得非常的庞大,一个简单的程序都会占用几十M的硬盘容量, ...
- outlook 2007 IMAP设置和配置
以Outlook2007为例(Outlook2003操作基本类似). 1.依次点击“工具”>“帐户设置”. 2.在“帐户设置”页中点击“新建”> 不需要做任何选择,点击下一步. 3.填写 ...
- oracle中job定时调用存储过程的实例
使用job模拟定时从元数据表中抽取指定数据进入目标表的过程. 一.创建元数据表 --create table test_origianl create table test_original_data ...
- PHP返回JSON和XML类
<?php class Reponse{ //private $result = array('code'=null,'message'=null,'data'=>null); /** * ...
- SQL Server数据库空间管理 (1)
数据库经常遇到的问题: 1).数据库文件空间用尽 2).日志文件不停增长 3).数据库文件无法收缩 4).自动增长和自动收缩 本系列就以上面的4个问题入手分析并总结数据库空间的管理方法. 1. ...
- DataGridView 去掉多余的列
去掉DataGridView多余的列: this.DataGridView.AutoGenerateColumns = false;
- Hadoop 4、Hadoop MapReduce的工作原理
一.MapReduce的概念 MapReduce是hadoop的核心组件之一,hadoop要分布式包括两部分,一是分布式文件系统hdfs,一部是分布式计算框就是mapreduce,两者缺一不可,也就是 ...
- linux使用FIO测试磁盘的iops
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, ...
- php算法之快速排序
/** * 快速排序 * 原理: * 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). * 最差时间复杂度 O(n*n) * ...