Linux下C编程(2)
本调用过程是一样的.我们对常用的一些函数进行仔细研究一下. 1)socket函数, socket函数不管是客户端还是服务端都是第一个要调用的函数,用来获取用于通信的描述符.如下图所示,其中domain是指的协议族或者地址簇.其中协议族是以PF_开头,如PF_INET,而地址族是AF_开头,如AF_INET,这两者其实是一样,特别在WINDOWS中,但在LINUX中BSD系统都是以AF,POSIX是PF.这里常用对IPV4是AF_INET,对DOMAIN SOCKET是AF_UNIX.对面向内核的是PF_KEY.type是指的socket类型,这个类型是常量,分为多种,最常用的是三种,流式SOCK_STREAM,面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收.数据报式SOCK_DGRAM,无连接服务,以独立包形式发送,不提供无错保证,顺序混乱.原始式SOCK_RAW,面向二层连接的开发.protocol参数一般设为0,主要是针对一个协议类型通常只有一种协议来支持.本函数调用成功,返回一个SOCKET描述符.通常称为套接字.失败是-1. 拥有帝国一切,皆有可能。欢迎访问phome.net
2)bind函数 通常的意义是给一个指定的socket描述一个名称,通常这个名称就是socket地址,这个地址结构体会根据不同的协议簇来决定地址内容,如IPV4通常是IP和端口.如下图所示,其中sockfd 是要指定的套接字描述符,my_addr是本地地址,也就是这个socket需要指定的名称.这个结构体是一个指针,因此,可以将这个指针指向不同类型的结构体,通过类型转换成sockaddr.如对IPV4是sockaddr_in,对local socket则是sockaddr_un等.addrlen则是长度.成功返回0,失败返回SOCK_ERROR.
2.1)struct socketadr 通用套接字接口地址结构体,这个结构比较难以使用,通常都是使用其它专门的结构体,并通过指针类型转换的方式进行使用.
这里其中sin_port就是端口地址,通常转为网络序就可以的.但是in_addr结构体也称网际套接口地址结构体,定义在<netinet/in.h>中,struct in_addr { in_addr_t s_addr;} 它是一个无符号32位整数.因此需要提供了一些转换函数将IP地址转成无符号函数.这三个函数是inet_aton inet_addr 或inet_ntoa. 如上图所示,使用这三个函数都可以将字符串如”10.192.184.2”这样的字符串转换成32位无符号数据IP地址. 2.2)多字节存储顺序,这个也就是俗称的大小头问题,如一个十六位数据0x12345678H在32位的机器中如何放在内存中呢?每们知道内存编址都是按字节作为最小单位的.存储这个值需要4个字节,那么将这个值的哪些位放到哪个字节中去呢?当然这需要有一个约定.通常有两种约定,这两种约定也是与机器架构有关的,如在INTERL这种架构中,大头在低位,如78存在0号56存在1号,34在2号12在3号.这就是little-endian.ARM也是这样的.另外一种是大头在高位.如IBM POWERC.网络协议中为保证不同机器之间的字节顺序不要弄错,默认为网络序,这种网络序在TCP/IP协议中采用高位先存格式,也就是big-endian.Socket由glibc提供,同样glibc也提供了转换函数. 拥有帝国一切,皆有可能。欢迎访问phome.net
3)listen函数 用于TCP服务器端.用来设置一个sockfd上可以排队的最大连接个数,也是用来通知内核在当前sockfd上进行监听的开始.进行listen的socket同时也是一个被动socket,主要用来充当服务器端.函数参数sockfd是前面socket函数返回的套接字.backlog表示在此描述符设备上排队的最大连接个数.
4)accept函数 同前面listen函数类似,只能用于TCP 服务器端.这是为什么呢?TCP有一个三次握手过程,因此这两个函数只出现在SOCK_STREAM类型的tcp socket中,不会出现在无连接的UDP socket中.通过listen与accept来维护连接属性是面向连接特有的函数.如下图所示,sockfd是socket函数返回的套接字,cliaddr是连接对方进程(客户)的协议地址,这是函数返回值.addrlen用来 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |