首页 理论教育ARM嵌入式系统:socket和地址绑定

ARM嵌入式系统:socket和地址绑定

【摘要】:网络通信时必须明确通信双方地址,而一个socke地址可以唯一表示一个通信端点,因此在通信前需进行socket地址绑定。图8.3sockaddr_in与sockaddr结构体对比从图8.3看出,sockaddr和sockaddr_in的长度相同,都是16字节,只是在sockaddr结构体中将IP地址和端口号合并到一起,用一个数组成员sa_data表示。要想给sa_data赋值,必须同时指明IP地址和端口号,例如“192.168.0.1:80”,遗憾的是,没有相关函数将这个字符串转换成需要的形式,也就很难给sockaddr类型的变量赋值,因此使用sockaddr_in来代替。

网络通信时必须明确通信双方地址,而一个socke地址可以唯一表示一个通信端点,因此在通信前需进行socket地址绑定。服务器端要用bind()函数将套接字与特定的IP地址和端口绑定起来。类似地,客户端也要用connect()函数建立连接。

Linux下bind()函数的原型为:

int bind(int sock,struct sockaddr*addr,socklen_t addrlen);

sock为socket文件描述符,addr为sockaddr结构体变量指针,addrlen为addr变量的大小,可由sizeof()计算得出。

通常在服务器端地址绑定的代码如下:

(www.chuimin.cn)

bind()第二个参数的类型为sockaddr,而代码中却使用sockaddr_in,然后再强制转换为sockaddr。这是为何?首先对比一下sockaddr_in与sockaddr结构体,如图8.3所示。

图8.3 sockaddr_in与sockaddr结构体对比

从图8.3看出,sockaddr和sockaddr_in的长度相同,都是16字节,只是在sockaddr结构体中将IP地址和端口号合并到一起,用一个数组成员sa_data表示。要想给sa_data赋值,必须同时指明IP地址和端口号,例如“192.168.0.1:80”,遗憾的是,没有相关函数将这个字符串转换成需要的形式,也就很难给sockaddr类型的变量赋值,因此使用sockaddr_in来代替。这两个结构体的长度相同,强制转换类型时不会丢失字节,也没有多余的字节。

这里需要注意的是SOCK_STREAM和SOCK_DGRAM类型的socket各有自己的端口空间,两个不同类型的socket绑定在同一端口上不会冲突。