第5章-unix网络编程 TCP/服务端程序示例
这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的

#include "unp.h"//static void str_cli1(FILE*fp,int sockfd);int main(int argc,char *argv[]){int sockfd;struct sockaddr_in servaddr;sockfd=Socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERV_PORT);Inet_pton(AF_INET,argv[1],&servaddr.sin_addr);Connect(sockfd,(SA*)&servaddr,sizeof(servaddr));str_cli(stdin,sockfd);//逻辑处理exit(0);}
#include "unp.h"void str_cli(FILE*fp,int sockfd){char sendline[MAXLINE],recvline[MAXLINE];while(Fgets(sendline,MAXLINE,fp)!=NULL){//从键盘接收保存到sendlineWriten(sockfd,sendline,strlen(sendline)); //写给服务端if(Readline(sockfd,recvline,MAXLINE)==0)//接收从服务端返回的数据err_quit("str_cli:服务端提前关闭");Fputs(recvline,stdout);//打印到屏幕}}
#include "unp.h"int main(int argc,char *argv[]){int listenfd=Socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in servaddr;servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERV_PORT);servaddr.sin_addr.s_addr=0;Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));Listen(listenfd,LISTENQ);for(;;){pid_t childpid;int connect=Accept(listenfd,NULL,NULL);if((childpid=Fork())==0){Close(listenfd);str_echo(connect);exit(0);}close(connect);- }
}
#include "unp.h"void str_echo(int sockfd){ssize_t n;char buf[MAXLINE];again:while((n=read(sockfd,buf,MAXLINE))>0)//读取Writen(sockfd,buf,n);//返回if(n<0&&errno==EINTR)goto again;else if(n<0)err_sys("str_echo :read error");}
Sigfunc * signal(int signo,Sigfunc *func){struct sigaction act,oact;act.sa_handler=func;sigemptyset(&act.sa_mask);// empty the block setmaskact.sa_flags=0;if(sigaction(signo,&act,&oact)<0)return (SIG_ERR);return oact.sa_handler;}
void sig_chld(int signo){pid_t pid;int stat;pid=wait(&stat);printf("child %d stoped\n",pid);}
if((connfd=accept(listenfd,NULL,NULL)<0){if(errno==EINTR)continue;elseerr_sys("accept error");}
pid_t wait(int *statloc);pid_t waitpid(pid_t pid,int *statloc,int options);
回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN (如阻塞在其它调用上而没有关闭 Socket
时),则客户 TCP 将处于 CLOSE_WAIT 状态。当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP
将立刻响应 RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络IO接收数据,很典型的如
read 或 readline 调用,此时由于执行时序的原因,如果该调用发生在 RST 分节收到前执行的话,那么结果是客户进程会得到一个非预期的
EOF 错误。此时一般会输出“server terminated prematurely”-“服务器过早终止”错误
第5章-unix网络编程 TCP/服务端程序示例的更多相关文章
- UNIX网络编程---TCP客户/服务器程序示例(五)
一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...
- Java网络编程(TCP服务端)
/* * TCP服务端: * 1.创建服务端socket服务,并监听一个端口 * 2.服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象 * 3.可以通过获 ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- 03-案例——多任务版TCP服务端程序开发
案例——多任务版TCP服务端程序开发 1. 需求 目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...
- python网络编程TCP服务多客户端的服务端开发
#服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...
- 【网络编程】服务端产生大量的close_wait状态的进程分析
首先要明白close_wait状态是在tcp通信四次握手时的一个中间状态: 即当被动关闭方发送完ACK后进入的状态.这个状态的结束,即要达到下一个状态LASK_ACK需要在发无端发送完剩余的数据后(s ...
- Python中的Tcp协议的应用之Tcp服务端程序开发
TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...
- Mina TCP服务端客户端 示例
服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...
- unix网络编程——TCP套接字编程
TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...
随机推荐
- UICollectionView实现无限轮播
#import "KGNewsController.h"#import "KGNewsCell.h"#import "KGNews.h"#i ...
- JS数据结构及算法(一) 堆栈
最近在看<学习JavaScript数据结构与算法>这本书,感觉自己又涨知识了 哈哈... 现在将自己看的做个总结,也是巩固理解. 栈:先进后出,新添加和待删除的元素都保存在栈顶.可以用数组 ...
- NOIP2016 toy
题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...
- 洛谷 1486/BZOJ 1503 郁闷的出纳员
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13866 Solved: 5069[Submit][Stat ...
- Linux - mkdir -p a/b/c
mkdir -p a/b/c -p 会循环创建
- 03Qt信号与槽(2)
1. 元对象工具 元对象编译器 MOC(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字及指向这些函 ...
- Altium Designer入门学习笔记3:关于各模块分开布线的理解( 1)
观看"杜洋AD的讲解视频",杜洋着重强调了"模块分开"布线的好处. ---------------------------------------------- ...
- python列表中的深浅copy
列表中的赋值和平常的赋值是不一样的,看下面的代码: In [1]: a = 1 In [2]: b = a In [3]: a Out[3]: 1 In [4]: b Out[4]: 1 In [5] ...
- python基础学习笔记——类的约束
⾸先, 你要清楚. 约束是对类的约束. 用一个例子说话: 公司让小明给他们的网站完善一个支付功能,小明写了两个类,如下: class QQpay: def pay(self,money): print ...
- 聊聊、Nginx 初始化日志文件
我们接着上一篇文章继续来看看 ngx_regex_init()函数.搜索 ngx_regex_init 得到位置为src/core/ngx_regex.c:ngx_regex_init(void). ...