linux网络编程通过套接字(socket)实现,socket是一种文件描述符
socket三种类型:流式套接字SOCK_STREAM,提供可靠的、面向连接的通讯流,使用TCP协议,保证通信可靠性和顺序性
数据报套接字SOCK_DGRAM,定义一种无连接服务,数据通过独立报文传输,无序,不保证可靠, 使用UDP
原始套接字SOCK_RAW使用IP协议,用于新型的网络测试
网络地址:struct sockaddr{
u_short sa_family; 协议族
char sa_data[14]; 协议地址
}
struct sockaddr_in{
short int sin_family; 协议族
unsigned short int sin_port; 端口号
struct int_addr sin_addr; 协议地址
unsigned char sin_zero[8]; 填0
}
typedef struct in_addr{
union{
struct{
unsigned char s_b1;
s_b2;
s_b3;
s_b4;
}S_un_b;
struct{
unsigned short s_w1;
s_w2;
}S_un_w;
unsigned long S_addr;
}S_un;
}IN_ADDR;
地址转换:IP通常是192.168.1.1形式,而struct in_addr的IP 地址由32位整数表示
int inet_aton(const char *cp,struct in_addr *inp) 将a.b.c.d形式转换为32位形式,存储在inp
char *inrt_ntoa(struct in_addr in) 将32位地址转换为啊,a.b.c.d
字节顺序转换:不同类型的cpu对变量的字节存储方式不一样,有的高位前低位后,有的低位前高位后。而网络字节顺序统一为高位前
htons 把unsigned short类型从主机序转换为网络序
htonl 把unsigned long类型从主机序转换为网络序
ntohs 把unsigned short类型从网络序转为主机序
ntohl 把unsigned longt类型从网络序转为主机序
网络上标识一台主机可以用IP地址,或者主机名
struct hostent *gethostbyname(const char *hostname){
char *h_name; 主机正式名
char *h_aliases; 主机别名
int h_addrtype; 主机地址类型
int h_length; 地址长度
char **h_addr_list ; IP地址列表
};
#define h_addr h_addr_list[0]
UDP网络程序设计
UDP服务器:创建一个socket,用函数socket()
绑定IP地址、端口号等信息到socket,用函数bind()
循环接收数据,用函数recvfrom()
关闭网络链接
UDP客户端:创建一个socket,用函数socket()
绑定IP地址、端口号等信息到socket,用函数bind()
设置对方IP地址和端口号等信息
发送数据,sendto()
关闭网络链接
TCP网络程序设计
TCP服务器:创建一个socket,用函数socket()
绑定IP地址、端口号等信息到socket,用函数bind()
设置允许的最大链接数,listen()
等待来自客户端的链接请求,accept()
收发数据,用函数send和recv(),或者read()和write()
关闭网络链接
TCP客户端:创建一个socket,用函数socket()
设置要链接服务器的IP地址和端口号等信息
链接服务器,connect()
收发数据,用函数send和recv(),或者read()和write()
关闭网络链接