Linux C Socket Api是什么


本文小编为大家详细介绍“Li免费云主机域名nux C Socket Api是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux C Socket Api是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。UNIX 环境高级编程对 Socket 通信的描述是套接字网络 IPC( 进程间通信 ) ,可以用于计算机间通信也可用于计算机内通信,管道、消息队列、信号量以及共享内存等都是属于计算机内通信的情况。首先会先到的是文件描述符,对Linux一切皆文件的哲学又多懂了一点儿点儿。套接字是通信端点的抽象。与应用程序使用文件描述符一样,访问套接字需要使用套接字描述符。套接字描述符在UNIX系统是用文件描述符实现的。参数 domain( 域 ) 确定通信的特性,包括地址格式。各个域都有自己的格式表示地址,表示各个域的常数都以 AF_开头,意指地址族 (address family).参数type确定套接字的类型,进一步确定通信特征。下图给出了一些类型,但在实现中可以自由增加对其他类型的支持。参数protocol通常是 0 ,表示按给定的域和套接字类型选择默认的协议。当对同一域和套接字类型支持多个协议时,可以使用 proticol 参数选择一个特定协议。在 A_FINET 通信域中套接字类型 SOCK_STREAM 的默认协议是 TCP( 传输控制协议 ) ; A_FINET 通信域中套接字类型 SOCK_DGRAM 的默认协议是 UDP( 用户数据报协议 ) 。字节流(SOCK_STREAM)要求在交换数据之前,在本地套接字和远程套接字之间建立一个逻辑联系。Tcp : 没有报文界限,提供的是字节流服务 。之前写过 Qt 传输图片的拆包与解包,原因就是如此吧。调用socket与调用 open 类型,均可获得用于输入、输出的文件描述符。不用的时候记得 close 关闭。如何确定一个目标通信进程?进程的标识有两个部分:计算机的网络地址可以确定网络上与之想要通信的计算机服务可以确定计算机上的特定进程。在同一台计算机上进程间通信时,一般无需考虑字节序。TCP/IP协议栈使用大端字节序。有关字节序大家可自行百度。Linux系统是小端字节序。地址确定了特定通信域中的套接字端点,地址格式与特定的通信域相关。为使不同格式的地址能够被传入到套接字函数,地址被强转换成通用的地址结构sockaddr表示。Linux中,sockaddr_in定义如下;struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};其中成员sin_zero为填充字段,必须全部置0. 所以在网上搜到的例子有使用bzero.我目前使用的ubuntu定义如下:/ Structure describing an Internet socket address. /
struct sockaddr_in
{
__SOCKADDRCOMMON (sin);
in_port_t sin_port; / Port number. /
struct in_addr sin_addr; / Internet address. /还有很多关于地址查询的函数,这里就不一一列举了。使用bind函数将地址绑定到一个套接字上。参数socklen_t使用sizeof来计算就好了。对于使用地址的一些限制:端口号不能小于1024,除非该进程具有相应的特权(即为超级用户)。可见规则总是因人而异,计算机也是如此~对于因特网域,如果指定IP地址为ADDR_ANY,套接字端点可以被绑定到所有的系统网络接口。注意: linuxman命令可以查看api的详细说明,而且还有例子,也挺不错的。如果处理的是面向连接的网络服务(SOCK_STREAMSOCK_SEQPACKET),在开始交换数据前,需要在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接。使用connect.诶,这个参数好熟悉呀,和bind函数的参数一模一样呀~当client连接server时,由于一些原因,连接可能会失败。可以使用指数补偿的算法解决,了解一下即可。server调用listen来宣告可以接受连接请求:参数backlog提供了一个提示,用于表示该进程所要入队的连接请求数量。其值由系统决定,但上限由SOMAXCONN指定。一旦队列满,系统会拒绝多余的连接请求。一旦服务器调用了listen,套接字就能接收连接请求。使用函数accept获得连接请求并建立连接。函数accept所返回的文件描述符是套接字描述符,该描述符连接到调用connect的客户端。这个新的套接字描述符和原始套接字(sockfd)具有相同的套接字类型和地址族。传给accept的原始套接字没有关联到这个连接,而是继续保持可用状态并接受其他连接请求。如果不关心客户端标识,可以将addrlen设置为NULL,否则addr存放的是连接的客户端的地址。如果没有连接请求等待处理,accept会阻塞直到有请求到来。另外server可以使用pollselect来等待一个请求的到来。既然将套接字端点表示为文件描述符,那么只要建立连接,就可以使用readwrite来通过套接字通信。readwrite函数我几乎不用,了解一下即可。注意:如果send成功返回,并不一定并表示连接的另一端的进程接收数据。可以保证的是数据已经无误的发送到网络上。标志我一直用的是0仍然一直是0如果想定位发送者,可以使用recvfrom来得到数据发送者的源地址。因为可以获得发送者的地址,recvfrom通常用于无连接套接字。否则,recvfrom等同于recv。读到这里,这篇“Linux C Socket Api是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。

相关推荐: 微信小程序组件事件的示例分析

这篇文章主要介绍了微信小程序组件事件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家免费云主机域名一起了解一下。 事件系统是组件间交互的主要形式。自定义组件可以触发任意的事件,引用组件的页面可以监听这…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/31 16:58
Next 08/31 16:59

相关推荐