TCP服务器
调用服务器
一、socket编程
1.socket
在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。
在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socketpair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连接的一对一关系。
2.网络字节序
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
h表示host,n表示network,l表示32位长整数,s表示16位短整数。例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
3.socket地址的数据类型及相关函数
本文基于IPv4的socket网络编程,sockaddr_in中的成员structin_addrsin_addr表示32位的IP地址。但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr表示之间转换。
字符串转in_addr的函数:
in_addr转字符串的函数:
4.TCP协议通信流程
服务器调用socket、bind、listen完成初始化后,调用accept阻塞等待,处于监听端口的状态,客户端调用socket初始化后,调用connect发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect返回,同时应答一个ACK段,服务器收到后从accept返回。
数据传输的过程:建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从accept返回后立刻调用read,读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write发送请求给服务器,服务器收到后从read返回,对客户端的请求进行处理,在此期间客户端调用read阻塞等待服务器的应答,服务器调用write将处理结果发回给客户端,再次调用read阻塞等待下一条请求,客户端收到后从read返回,发送下一条请求,如此循环下去。
如果客户端没有更多的请求了,就调close关闭连接,就像写端关闭的管道一样,服务器的read返回0,这样服务器就知道客户端关闭了连接,也调用close关闭连接。注意,任何一方调用close后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown则连接处于半关闭状态,仍可接收对方发来的数据。
二、代码实现
1.Makefile的编写
2.服务器代码实现
3.客户端代码实现
三、结果展示
Tags:调用服务器,TCP服务器
版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。