执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. 执行netstat -a命令观察当前的连接状态,发现了两个新的连接: 以及 上面一个连接说明一个连接到服务器的连接,客户端临时端口是32818,目的端口正是先前的9877,连接状态为已建立,对应已连接套接字: 下面一个连接说明一个连接到客户端的连接,服务端端口为9877,目的端口是32818,这个连…
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. 执行netstat -a命令观察当前的连接状态,发现了两个新的连接: 以及 上面一个连接说明一个连接到服务器的连接,客户端临时端口是32818,目的端口正是先前的9877,连接状态为已建立,对应已连接套接字: 下面一个连接说明一个连接到客户端的连接,服务端端口为9877,目的端口是32818,这个连…
前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 ):同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程序的技巧. 客户端 #include "unp.h" void str_cli(FILE *fp, int sockfd); int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; ) err_q…
前言 之前曾经学习过一对回射客户/服务器程序的例子,不过那个是基于TCP协议的.本文将讲解另一对回射客户/服务器程序,该程序基于UDP协议. 由于使用的协议不同,因此编写出的程序也有本质上的区别,应将它们对比来进行理解. 通信框架 服务器端 #include "unp.h" int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr, cliaddr; // 创建UDP套接字 sockfd = So…
前言 之前曾经学习过一对回射客户/服务器程序的例子,不过那个是基于TCP协议的.本文将讲解另一对回射客户/服务器程序,该程序基于UDP协议.由于使用的协议不同,因此编写出的程序也有本质上的区别,应将它们对比来进行理解. 通信框架 服务器端 #include "unp.h" int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr, cliaddr; // 创建UDP套接字 sockfd = Soc…
下面通过最简单的客户端/服务器程序的实例来学习socket API. echoser.c 程序的功能是从客户端读取字符然后直接回射回去.  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60…
客户端程序 #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<stdlib.h> #include<stdio.h> #include<errno.h> #include<sys/un.h> #include<fcntl.h> #include<sys/msg.…
一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并与服务端进行通信: 2. 利用套接口描述符进行通信,必须知道对端的IP与端口. 二.相关函数介绍 下面,我们利用System V消息队列来实现进程间的通信: 首先,我们先来了解一下下面几个函数: 1. msgget: 该函数用于打开或创建消息队列,其作用相当与文件操作函数open. #include…
一.msgsnd 和 msgrcv 函数 #include <sys/types.h>   #include <sys/ipc.h>   #include <sys/msg.h> 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由msgget函数返回的消息队列标识码 msgp:是一个指针,指针指向准备发送的消息结构体 msgs…
目录 客户/服务器程序源码 POSIX信号处理 POSIX信号语义 处理SIGCHLD信号 处理僵死进程 处理被中断的系统调用 wait和waitpid函数 wait和waitpid函数的区别 网络编程可能会遇到的三种情况 TCP程序小结 数据格式   回射输入行这样一个客户/服务器程序是一个虽然简单然而却很有效的网络应用程序的例子.实现任何客户/服务器网络应用所需的所有基本步骤可通过本例子阐明.若想把本例子扩充成你自己的应用程序,你只需修改服务器对于来自客户的输入的处理过程. TCP回射服务器…
socket函数(安装电话机)头文件:#include<sys/socket.h> int socket(int family,  int type, int protocol); //返回套接字描述符sockfd, 失败返回-1参数 1.family:协议族PF_INET/AF_INET2.type:套接字类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW3.protocol:协议类型(TCP/UDP/SCTP) bind函数:(绑定号码)…
一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数简单的main的实现 #define MAXLINE 1024 void str_echo(int); int main(int argc,char *argv[]) { struct sockaddr_in serveraddr,cliaddr; char recvline[MAXLINE+1];…
一个回射服务器: 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 回射输入行这样一个客户/服务器程序是一个尽管简单然而有效的网络程序例子 实现任何客户/服务器网络应用所需的所有基本步骤可通过本例子阐述 若想把本例子扩充成你自己的应用程序,你只需修改服务器对来自客户的输入的处理过程 除了以正常的方式运行本例子的客户和服务器(即键入一行文本并观察它的回射)之外 我们还会讨论它的许多边界条件: 客户和…
UNIX网络编程 第5章 TCP客户/服务器程序示例…
I/O复用:当一个或多个I/O条件满足时,我们就被通知到,这种能力被称为I/O复用. 1.I/O复用的相关系统调用 posix的实现提供了select.poll.epoll两类系统调用以及相关的函数来实现I/O复用.select以及相关联的函数如下所示: #include <sys/select.h> /* 功能:监听多个fd,等待指定的fd指定的事件发生或者超时. * nfds: 最大描述符加1. * readfds:监听读fd集合. * writefds:监听写fd集合. * except…
str_cli函数完成客户处理循环: 从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射行写到标准输出上 读入一行,写到服务器 fgets读入一行文本,writen把该行发送给服务器 从服务器读入回射行,写到标准输出 readline从服务器读入回射行,fputs把它写到标准输出 返回main函数 当遇到文件结束符或错误时,fgets将返回一个空指针,于是客户处理循环终止 我们的Fgets函数检查是否发生错误,若发生则中止进程,因此Fgets只是在遇到文件结束符时才返回一个空…
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);  //设置套接字选项 回射服务器编写,服务器关闭后处于TIME_WAIT状态,过一段时间才可以绑定刚才的端口.在绑定服务器之前尽可能调用setsockopt来设置REUSEADDR套接字选项,使用REUSEADDR选项可以使得不必等待TIME_WAIT状态消失就可以重启服务器 服务器处理多并发,客户端短连接过来就创建子…
创建套接字,装填网际网套接字地址结构 创建一个TCP套接字,用服务器的IP地址和端口号装填一个网际网套接字地址结构 我们可从命令行参数取得服务器的IP地址 从头文件unp.h取得服务器的众所周知端口号(SERV_PORT) 连接到服务器 connect建立与服务器的连接 str_cli函数完成剩余部分的客户处理工作 #include "unp.h" int main(int argc, char **argv) { int sockfd; struct sockaddr_in serv…
服务器程序: #include <sys/wait.h> #include <string.h> #include <string.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <signal.h> #includ…
TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write --- read() --- close TCP客户 socket() --- connect() --- write() --- read()  --- close() 套接字函数简介 int socket(int family, int type, int protocol); 指定要用的通信协议类…
话不多说,直接上干货,下面两个程序都是linux程序. server.c完整代码: #include <stdio.h>#include <string.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>…
总览 SYNOPSIS nmblookup [-M] [-R] [-S] [-r] [-A] [-h] [-B <broadcast address>] [-U <unicast address>] [-d <debug level>] [-s <smb config file>] [-i <NetBIOS scope>][-T] [-f] {name} 描述 DESCRIPTION nmblookup 是 Samba(7)套件的一部分. nmb…
signal 信号是一种软件中断,异步发生,在进程运行的时候随时可能发生.信号可以: 由一个进程发给另一个进程,或发给自身 由内核发给某个进程 信号的action: signal handler,在信号发生时被调用,这个过程也称为捕获信号.SIGKILL/SIGSTOP两个信号不能被捕获. 设定SIG_IGN来忽略信号.SIGKILL/SIGSTOP两个信号不能被忽略. 设定SIG_DFL来启用信号的默认处理. 信号相关函数: #include <signal.h> int sigaction…
TCP回射并发服务器 1.创建套接字,绑定服务器的众所周知端口 创建一个TCP套接字,在待绑定到该TCP套接字的网际网套接字地址结构中填入通配地址(INADDR_ANY) 和服务器的众所知周(SERV_PORT,在头文件中unp.h中其定义为9877) 绑定通配地址是在告知系统: 要是系统是多宿主机,我们将接受目的地地址为任何本地接口的连接 我们对TCP端口号的选择应该比1023大,比5000大,比49152小,而且不和任何注册的端口冲突 listen把该套接字地址转换成一个监听套接字 2.等待…
chapter5  5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in, cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); ser…
chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in, cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); serv…
该函数提供的是一个迭代服务器,而不是像TCP服务器那样可以提供一个并发服务器.其中没有对fork的调用,因此单个服务器进程就得处理所有客户.一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是迭代的. 对于本套接字,UDP层中隐含有排队发生.事实上每个UDP套接字都有一个接收缓冲区,到达该套接字的每个数据报都进入这个套接字接收缓冲区.当进程调用recvfrom时,缓冲区中的下一个数据报以FIFO(先入先出)顺序返回给进程. 服务器程序: #include<stdio.h> #inclu…
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Client/Server),比如我们需要玩英雄联盟,就必须连接至英雄联盟的服务器上,那么对于我们玩家来说它的英雄联盟服务器就是Server端,而我们必须要有一个英雄联盟Client端才能够去和英雄联盟Server端进行数据交互. 互联网的协议实际上就是为了让计算机之间互相进行通信,只是按照功能不同分为…
上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.server从网络输入读入这行文本,并回射给客户. 3.客户从网络输入读入这行回射文本,并显示在标准输出上. 用图描写叙述例如以下: 编写TCP回射server程序例如以下: #include <stdio.h> #include <errno.h> #include <stdlib…