如何基于如何基于C语言语言socket编程实现编程实现TCP通信通信
本文介绍了如何基于C语言socket编程实现TCP通信,下面小编来简单介绍下
TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通信协议。实际上,它包
含上百个功能的协议,如ICMP(互联网控制信息协议)、FTP(文件传输协议)、UDP(用户数据包协议)、ARP(地址解
析协议)等。TCP负责发现传输的问题,一旦有问题就会发出重传信号,直到所有数据安全正确的传输到目的地。
套接字(socket):在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。socket其实是一种特殊的IO借口,也
是一种文件描述符。
套接字分为三类:
流式socket(SOCK_STREAM):流式套接字提供可靠、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确
性和顺序性。
数据报socket(SOCK_DGRAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的保温进行传输,是无序的,
并且不保证是可靠、无差错的。它使用的数据报协议是UDP。
原始socket:原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用复杂,主要用于一些协议的开发。
套接字由三个参数构成:IP地址,端口号,传输层协议。
这三个参数用以区分不同应用程序进程间的网络通信与连接。
套接字的数据结构:C语言进行套接字编程时,常会使用到sockaddr数据类型和sockaddr_in数据类型,用于保存套接字信
息。
两种结构体分别表示如下:
struct sockaddr
{
//地址族,2字节
unsigned short sa_family;
//存放地址和端口,14字节
char sa_data[14];
}
struct sockaddr_in
{
//地址族
short int sin_family;
//端口号(使用网络字节序)
unsigned short int sin_port;
//地址
struct in_addr sin_addr;
//8字节数组,全为0,该字节数组的作用只是为了让两种数据结构大小相同而保留的空字节
unsigned char sin_zero[8]
}
对于sockaddr,大部分的情况下只是用于bind,connect,recvfrom,sendto等函数的参数,指明地址信息,在一般编程中,
并不对此结构体直接操作。而是用sockaddr_in来代替。
两种数据结构中,地址族都占2个字节,常见的地址族有:AF_INET,AF_INET6,AF_LOCAL。
这里要注意字节序的问题,最好使用以下函数来对端口和地址进行处理:
uint16_t htons(uint16_t host16bit) uint32_t htonl(uint32_t host32bit)
uint16_t ntohs(uint16_t net16bit) uint32_t ntohs(uint32_t net32bit)
将主机字节序改成网络字节序。
使用socket进行TCP通信时,经常使用的函数有: