第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客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...
随机推荐
- HTTP无状态协议和session原理(access_token原理)
无状态协议是指协议对务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要先前信息时它的应答就较快. Http协议不 ...
- C#经典面试题——递归运算
今天开始写递归,然而始终不得甚解.借鉴别人的理解:假设我们现在都不知道什么是递归,我们自然想到打开浏览器,输入到谷歌的网页,我们点击搜索递归,然后我们在为维基百科中了解到了递归的基本定义,在了解到了递 ...
- Golang tcp转发 remoteAddr错误
Golang tcp 转发 第一版本 accept获取的Conn里的localAddr做为源地址,remoteAddr来做为目的地址 // tcpForward package main import ...
- paper:synthesizable finite state machine design techniques using the new systemverilog 3.0 enhancements 之 FSM Coding Goals
1.the fsm coding style should be easily modifiable to change state encoding and FSM styles. FSM 的的 状 ...
- DeepFaceLab小白入门(2):软件安装!
严格上来说这个软件本身并不需要安装,他唯一需要的就是对应版本的显卡驱动,CUDA和CuDNN都非必须.下面我说一下如何安装正确的驱动版本.我尽量写得简洁清晰,希望大家都能看懂,但是,如果你连基本的电脑 ...
- python爬虫基础18-Chrome调试前端工具
01 Chrome调试 抓包工具原理 Chrome 开发者工具是一套内置在Google Chrome中Web开发和调试工具.使用开发者工具来重演,调试和剖析您的网站. 其中常用的有Elements(元 ...
- python爬虫基础13-selenium大全7/8-异常
Selenium笔记(7)异常 本文集链接:https://www.jianshu.com/nb/25338984 完整文档 Exceptions that may happen in all the ...
- GoF23种设计模式之行为型模式之访问者模式
概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依 ...
- 使用nohup+& 踩到的坑
首先分清楚nohup与&: &是指在后台运行一般在执行命令后,都会显式的在前台执行,当Ctrl+C后进程回宕掉,但是 在命令后加&,即使Ctrl+C,程序还在进行,但是,当关闭 ...
- LeetCode(151) Reverse Words in a String
题目 Given an input string, reverse the string word by word. For example, Given s = "the sky is b ...