1、socket编程编程
1.socket 服务器
在TCP/IP协议中,“IP地址+TCP或UDP端口号”惟一标识网络通信中的一个进程,“IP地址+端口号”就称为socket。 网络
在TCP协议中,创建链接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就惟一标识一个链接。socket自己有“插座”的意思,所以用来描述网络链接的一 对一关系。socket
2.网络字节序ide
发送主机一般将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,所以,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。 函数
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。spa
为使网络程序具备可移植性,使一样的C代码在大端和小端计算机上编译后都能正常运行,能够调用如下库函数作网络字节序和主机字节序的转换。3d
h表示host,n表示network,l表示32位长整数,s表示16位短整数。例 如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。若是主机是小端字节序,这些函数将参数作相应的大小端转换而后返回,若是主机是大端字节序,这些 函数不作转换,将参数原封不动地返回。 orm
3.socket地址的数据类型及相关函数blog
本文基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_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() 则链接处于半关闭状态,仍可接收对方发来的数据。
2、代码实现
1.Makefile的编写
2.服务器代码实现
3.客户端代码实现
3、结果展现