随笔分类 - unix网络编程[卷1]
摘要:arp欺骗原理 某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后,就会进行数据传输。如果未找到,则广播A一个ARP请求报文(携带主机A的IP地址Ia——物理地址Pa),请求IP地址为Ib的主机B回答物理地址Pb。网上所有主机包括B都收到ARP请求,但只有主机B
阅读全文
摘要:选择一台电脑(有两个网卡或者用单网卡然后用软件虚拟多一个网卡)充当网关,一个网卡(eth0)连接外网ISP,另一网卡(eth1)连接内网(即局域网)。局域网内的ip地址都是私用地址,只能在内部使用,在公网上是不可见的,所以局域网电脑要上网必须修改ip,这就是网关的工作。 工作原理: 内网主机向公网发
阅读全文
摘要:尽管我们的TCP程序例子很小 2个main函数加上str_echo、str_cli、readline、writen 然而对于我们弄清客户和服务器如何启动,如何终止,更为重要的是当发生某些错误时将会发生什么 (例如:客户主机崩溃,客户进程崩溃,网页连接断开,等等) 只有搞清楚这些边界条件以及它们与TC
阅读全文
摘要:str_cli函数完成客户处理循环: 从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射行写到标准输出上 读入一行,写到服务器 fgets读入一行文本,writen把该行发送给服务器 从服务器读入回射行,写到标准输出 readline从服务器读入回射行,fputs把它写到标准输出
阅读全文
摘要:创建套接字,装填网际网套接字地址结构 创建一个TCP套接字,用服务器的IP地址和端口号装填一个网际网套接字地址结构 我们可从命令行参数取得服务器的IP地址 从头文件unp.h取得服务器的众所周知端口号(SERV_PORT) 连接到服务器 connect建立与服务器的连接 str_cli函数完成剩余部
阅读全文
摘要:str_echo函数执行处理每个客户的服务: 从客户读入数据,并把它们回射给客户 读入缓冲区并回射其中内容: read函数从套接字读入数据,writen函数把其中内容回射给客户 如果客户关闭连接,那么接收到客户的FIN将导致服务器子进程的read函数返回0,这又导致str_echo函数的返回,从而终
阅读全文
摘要:TCP回射并发服务器 1.创建套接字,绑定服务器的众所周知端口 创建一个TCP套接字,在待绑定到该TCP套接字的网际网套接字地址结构中填入通配地址(INADDR_ANY) 和服务器的众所知周(SERV_PORT,在头文件中unp.h中其定义为9877) 绑定通配地址是在告知系统: 要是系统是多宿主机
阅读全文
摘要:一个回射服务器: 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 回射输入行这样一个客户/服务器程序是一个尽管简单然而有效的网络程序例子 实现任何客户/服务器网络应用所需的所有基本步骤可通过本例子阐
阅读全文
摘要:这2个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址(getpeername) int getsockname(int sockfd, struct sockaddr* localaddr, socklen_t * addrlen); i
阅读全文
摘要:int close(int sockfd); close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程, 该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或write的第一个参数 并发服务器中父进程关闭已连接套接字只是导致相应描述符的引用数值减1,既然引用
阅读全文
摘要:当服务一个客户请求可能花费较长时间时,我们并不希望整个服务器被单个客户长期占用,而是希望同时服务多个客户 unix中编写并发服务器程序最简单的方法就是fork一个子进程来服务每个客户 典型的并发服务器程序轮廓 当一个连接i建立时,accpt返回,服务器接着调用fork,然后由子进程服务客户,父进程则
阅读全文
摘要:fork函数调用一次,返回2次 它在调用进程中返回一次,返回值是新派生进程的进程ID号 在子进程又返回一次,返回值是0 因此,返回值本身告诉当前进程的子进程还是父进程 fork在子进程返回0而在父进程返回进程ID的原因在于: 任何子进程只有一个父进程,而子进程总是可以通过调用getppid取得父进程
阅读全文
摘要:accept函数由TCP服务器调用,用于从以完成连接队列队头返回下一个以完成连接 如果以完成队列为空,那么进程被投入睡眠(假定套接字为默认的阻塞方式) int acceptn ( int sockfd, struct sockaddr * cliaddr,socklen_t * addrlen);
阅读全文
摘要:listen函数仅仅由TCP服务器调用,它做2件事: 1)当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字 listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求 调用listen导致套接
阅读全文
摘要:bind函数把一个本地协议地址赋予一个套接字 对于网际协议,协议地址是32位的IPv4地址或128位的IPv6与16位的TCP或UDP端口号的组合 int bind ( int sockfd, const struct sockaddr * myaddr ,socklen_t addrlen); b
阅读全文
摘要:注意: connect函数导致当前套接字从CLOSE状态(该套接字自从由socket函数创建以来一直所处的状态)转移到SYN_SENT状态 若成功则再转移到ESTABLISHED状态, 若connect失败则该套接字不再可用,必须关闭,我们不能对这样的套接字再次调用connect函数 当循环调用函数
阅读全文
摘要:TCP客户用connect函数来建立与TCP服务器的连接 int connect (int sockfd, const sockaddr * servaddr, socklen_t addrlen); sockfd是由socket函数返回的套接字描述符 servaddr指向套接字地址结构的指针 ad
阅读全文
摘要:为了执行网络IO,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 int socket(int family,int type,int protocol); 其中,family参数指定协议簇,type参数指明套接字类型,protocol参数一般为0 TCP是一个字节流协议,
阅读全文
摘要:字节流套接字上的read和write函数所表现的行为不同于通常的文件IO 字节流套接字上调用read或write输入或输出的字节数可能比请求的数量少,然而这不是出错的状态 这个现象的原因在于内核中用于套接字的缓冲区可能已经达到了极限 此时需要的是调用者再次调用read或write函数,以输入或输出剩
阅读全文
摘要:inet_ntop的一个基本问题是:它要求调用者传递一个指向某个二进制地址的指针, 而该地址通常包含在一个套接字地址结构中,这就要求调用者必须知道这个结构的格式和地址簇, 为了使用这个函数,我们必须为IPv4编写如下代码: struct sockaddr_in addr; inet_ntop(AF_
阅读全文