Socket
Linux中的网络编程通过socket()实现,socket是一种文件描述符。
Socket有三种类型:
Ø 流式套接字(SOCK_STREAM)
流式套接字可以提供可靠的,面向连接的通讯流,他使用TCP协议。TCP保证了数据传输的正确性和顺序性。
Ø 数据报套接字(SOCK_DGRAM)
定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的, 并且不保证可靠,无差错,他使用数据报协议UDP.
Ø 原始套接字(SOCK_RAW)
原始套接字允许使用IP协议,主要用于新的网络协议的测试等。
网络地址:
1)在socket程序设计中,struct sockaddr 用于记录网络地址:
Struct sockaddr
{
u_short sa_family;
char sa_data[14];
}
ü Sa_family 协议族,采用“AF_xx”的形式,如:AF_INET(ip协议族)。
ü Sa_data: 14字节的特定协议地址
2)在socket程序设计中,struct sockaddr_in同样用于记录网络地址
Struct dockaddr_in
{
Short int sin_family; //协议族
Unsigned short int sin_port; //端口号
struct in_addr sin_addr ; //协议特定地址
unsigned char sin_zero [8]; //填0
}
在编程中一般使用与sockaddr等价的sockaddr_in数据结构
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.0.1)的形式。而在struct in_addr中使用的IP地址是由32位的整数表示的,为了转换我们可以使用下面两个函数:
Ø int inet_aton (const char *cp,struct in_addr *inp)
Ø char *inet_ntoa (struct in_addr in)
函数里a代表ascii,n代表network
Inet_aton是将a,b,c,d形式的IP转换为32位的IP,存储在inp指针里,inet_ntoa是将32位IP转换为a,b,c,d的格式。
字节序转换
如:intel的CPU使用的小段字节序,motorola 68系列的CPU使用的是大端字节序。
Motorola发送一个16位的数据0X1234给intel,传到INTEL时,就被intel解释为0X3412
Ø htons 把unsigned short 类型从主机序列转换到网络序(发送使用)
Ø htonl 把unsigned long 类型从主机序转换到网络序(发送使用)
Ø ntohs 把unsigned short 类型从网络序列转换到主机序(接受)
Ø ntohi 把unsined long 类型从网络序转换到主机序
socket编程函数
Ø socket 创建一个socket
Ø bind 用于绑定ip地址和端口号到socket
Ø connect 该函数用于与服务器建立连接
Ø listen 设置服务器能处理的最大连接要求
Ø accept 用来等待来自客户端的socket连接请求
Ø send 发送数据
Ø recv