Li
ux网络编程实例详解
本文介绍了在Li
ux环境下的socket编程常用函数用法及socket编程的一般规则和客户服务器模型的编程应注意的事项和常遇问题的解决方法,并举了具体代码实例。要理解本文所谈的技术问题需要读者具有一定C语言的编程经验和TCPIP方面的基本知识。要实习本文的示例,需要Li
ux下的gcc编译平台支持。
Socket定义网络的Socket数据传输是一种特殊的IO,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket,该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式SocketSOCK_STREAM和数据报式SocketSOCK_DGRAM。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket编程相关数据类型定义计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。I
te
et上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在I
ter
et上传输数据时就需要进行转换。我们要讨论的第一个结构类型是:structsockaddr,该类型是用来保存socket信息的:structsockaddru
sig
edshortsa_familycharsa_data14sa_family一般为AF_INET;sa_data则包含该socket的IP地址和端口号。另外还有一种结构类型:structsockaddr_i
fshorti
tsi
_familyu
sig
edshorti
tsi
_portstructi
_addrsi
_addru
sig
edcharsi
_zero8这个结构使用更为方便。si
_zero它用来将sockaddr_i
结构填充到与structsockaddr同样的长度应该用bzero或memset函数将其置为零。指向sockaddr_i
的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddr_i
的指针转换为指向sockaddr的指针;或者相反。si
_family通常被赋AF_INET;i
_port和si
_addr应该转换成为网络字节优先顺序;而si
_addr则不需要转换。我们下面讨论几个字节顺序转换函数:hto
s