Jul 30

函数linuxsocket收集编程详解详解

Posted by liuxu at 14:11 | 电脑教程 | 评论(0) | 阅读(21) | 转自 本站原创 | |
函数  字节  地址  协定  指针  标语  数据结构  程式  端口  接口  主机  类型  消息  次序  本土  数据  结构  异样  系统  赋值  低位  主动  文档  数据传输  原型  高位  客户端  整型  相似  定义  需求  参数  大年夜  别的  句柄  中保  便当  时分  存储空间  长度  例程  原始  两个  代表  通信  方法  机械  电脑
linuxsocketShou∴Ji∴Bian∴Cheng∴Xiang∴Jie甚么是Socket
Socket接口是TCP/IP收集的API!Socket接口定义了很多函数或者例程!程式员能够用他们来研发TCP/IP收集上的使用程式要学Internet上的TCP/IP收集编程!必须了解Socket接口
Socket接口设想者最早是将接口放正在Unix操纵系统外面的假设了解Unix系统的输进和输进的话!就很简单了解Socket了收集的 Socket数据传输是壹种特地的I/O!Socket也是壹种文档描绘符Socket也具有壹个相似于打开文档的函数调用Socket!该函数前往壹个整型的Socket描绘符!随后的连接建立!数据传输等操纵都是经过该Socket完成的经常使用的Socket类型有两种流式Socket 和数据报式Socket流式是壹种面向连接的Socket!针对于面向连接的TCP效劳使用数据报式Socket是壹种无连接的Socket!对应于无连接的UDP效劳使用
Socket建立
为了建立Socket!程式能够调用Socket函数!该函数前往壹个相似于文档描绘符的句柄socket函数原型为
int socket。
domain指明所使用的协定族!通常是PF_INET!表现互连网协定族type参数指定socket的类型 SOCK_STREAM 或者SOCK_DGRAM!Socket接口还定义了原始Socket!答应程式使用低层协定protocol一般赋值"0" Socket调用前往壹个整型socket描绘符!您能够正在前面的调用使用他
Socket描绘符是个指向外部数据结构的指针!他指向描绘符表出口调用Socket函数时!socket施行体将建立壹个Socket!实践上"建立壹个Socket"意味着为壹个Socket数据结构分派存储空间Socket施行体为您治理描绘符表
两个收集程式之间的壹个收集连接包含伍种消息通信协定!本土协定地址!本土主机端口!远端主机地址和远端协定端口Socket数据结构中包含这伍种消息
Socket建设
经过socket调用前往壹个socket描绘符后!正在使用socket停止收集传输之前!必须建设该socket面向连接的socket客户端经过调用Connect函数正在socket数据结构中保管本土和远端消息无连接socket的客户端和效劳端连同面向连接socket的效劳端经过调用 bind函数来建设本土消息
Bind函数将socket和本机上的壹个端口相干联!随后您就可以够正在该端口监听效劳恳求Bind函数原型为
int bind。
Sockfd是调用socket函数前往的socket描绘符!my_addr是个指向包含有本机IP地址及端标语等消息的sockaddr类型的指针addrlen常被建设为sizeof
struct sockaddr结构类型是用来保管socket消息的
struct sockaddr  
unsigned short sa_family。 / 地址族! AF_xxx /
char sa_data14。 / 14 字节的协定地址 /

sa_family通常是AF_INET!代表Internet地址族sa_data则包含该socket的IP地址和端标语
别的更有壹种结构类型
struct sockaddr_in  
short int sin_family。 / 地址族 /
unsigned short int sin_port。 / 端标语 /
struct in_addr sin_addr。 / IP地址 /
unsigned char sin_zero8。 / 填充0 以保持和struct sockaddr异样大年夜小 /

这个结构更便当使用sin_zero用来将sockaddr_in结构填充到和struct sockaddr异样的长度!能够用bzero或者memset函数将其置为零指向sockaddr_in 的指针和指向sockaddr的指针能够相互转换!这意味着假设壹个函数所需参数类型是sockaddr时!您能够正在函数调用的时分将壹个指向 sockaddr_in的指针转换为指向sockaddr的指针或者相同
使用bind函数时!能够用下面的赋值完成主动取得本机IP地址和随机获得壹个没有被占用的端标语
my_addr.sin_port = 0。 / 系统随机挑选壹个未被使用的端标语 /
my_addr.sin_addr.s_addr = INADDR_ANY。 / 填进本机IP地址 /
经过将my_addr.sin_port置为0!函数会主动为您挑选壹个未占用的端口来使用异样!经过将my_addr.sin_addr.s_addr置为INADDR_ANY!系统会主动填进本机IP地址
留心正在使用bind函数是需求将sin_port和sin_addr转换成为收集字节优先次序递次而sin_addr则无需转换
电脑数据存储有两种字节优先次序递次高位字节优先和低位字节优先Internet上数据以高位字节优先次序递次正在收集上传输!所以对于正在外部是以低位字节优先方法存储数据的机械!正在Internet上传输数据时就需求停止转换!不然就会出现数据不一致
下面是几个字节次序递次转换函数
htonl把32位值从主机字节序转换成收集字节序
htons把16位值从主机字节序转换成收集字节序
ntohl把32位值从收集字节序转换成主机字节序
ntohs把16位值从收集字节序转换成主机字节序甚么是Socket Socket接口是TCP/IP收集的API!Socket接口定义了很多函数或者例程!程式员能够用他们来研发TCP/
刘旭 ' blog  http://www.liuxu.info
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]