socket网络编程知识
1 sockaddr和sockaddr_in
这两个结构体都用来处理网络通信的地址
sockaddr在头文件<sys/socket.h>
中定义,它的缺陷是sa_data将目标地址和端口混在了一起,其具体定义如下:
struct sockaddr{sa_family_t sin_family; ;地址族char sa_data[14]; ;14字节,包括socket中的目标地址和端口信息
}
sockaddr_in在头文件netinet/in.h
或arpa/inet.h
中定义,该结构体解决了sockaddr的缺陷,将port和addr分开储存在两个变量中,其定义如下:
struct sockaddr_in{sa_family_t sin_family; //地址族uint16_t sin_port; //16位TCP/UDP端口号struct in_addr sin_addr; //32位IP地址char sin_zero[8]; //不使用
该结构体中提到的另一个结构体in_addr定义如下,它用来存放32位IP地址:
struct in_addr{In_addr_t s_addr; //32位IPv4地址
}
sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。
对比
两者长度一样,都是16个字节,即占用内存的大小是一致的,因此可以互相转化。两者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。
sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息,是一种通用的套接字地址。
sockaddr_in是Internet环境下socket的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数。即,sockaddr_in用于socket定义和赋值,sockaddr用于函数参数。
htons()和inet_addr()
htons()的作用是将端口号由主机字节序转换为网络字节序的整数值(host to net)。
inet_addr()的作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。
inet_ntoa()的作用是将一个sin_addr结构体输出成IP字符串(network to ascⅡ)。
htonl()作用和htons()一样,不过它针对的是32位的(long),而htons()针对的是16位的(short)。
与htonl()和htons()作用相反的两个函数是ntohl()和ntohs()。
2 socket()函数介绍
函数原型:
int socket(int domain, int type, int protocol);
这个函数建议一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。
domain
这个参数用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h
中定义。
domain的值及含义如下表所示:
名称 | 含义 |
---|---|
PF_UNIX, PF_local | 本地通信 |
AF_INET, PF_INET | IPv4网络协议 |
PF_INET6 | IPv6网络协议 |
PF_IPX | IPX-NoveⅡ协议 |
PF_NETLINK | 内核用户界面设备 |
PF_X25 | ITU-T X25 / ISO-8208协议 |
PF_AX25 | Amateur radio AX.25 |
PF_ATMPVC | 原始ATM PVC访问 |
PF_APPLETALK | Appletalk |
PF_PACKET | 底层包访问 |
type
用于设置套接字通信的类型,主要值及对应解释如下:
名称 | 含义 |
---|---|
SOCK_STREAM | Tcp连接,提供序列化的、可靠的、双向连接的字节流。支持带外数据传输 |
SOCK_DGRAM | 支持UDP连接(无连接状态的消息) |
SOCK_SEQPACKET | 序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定长。每次调用读系统调用时数据需要将全部数据读出 |
SOCK_RAW | RAW类型,提供原始网络协议访问 |
SOCK_RDM | 提供可靠的数据报文,不过可能数据会有乱序 |
SOCK_PACKET | 这是一个专用类型,不能呢过在通用程序中使用 |
注意,并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。
protocol
这个参数用于指定某个协议的特定类型,即type类型的某个类型。通常某协议中只有一种特定类型,这样protocol参数仅能设置为0;但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。
errno
函数socket()并不总是执行成功,有可能会出现错误,错误的产生有多种原因,可以通过errno获得:
值 | 含义 |
---|---|
EACCES | 没有权限建立指定的domain的type的socket |
EAFNOSUPPORT | 不支持所给的地址类型 |
EINVAL | 不支持此协议或者协议不可用 |
EMFILE | 进程文件表溢出 |
ENFILE | 已经达到系统允许打开的文件数量,打开文件过多 |
ENOBUFS/ENOMEM | 内存不足。socket只有到资源足够或者有进程释放内存 |
EPROTONOSUPPORT | 指定的协议type在domain中不存在 |
socket网络编程知识相关推荐
- 网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
参考:SOCKET,TCP,HTTP之间的区别与联系 作者:丶PURSUING 发布时间: 2021-03-19 11:54:01 网址:https://blog.csdn.net/weixin_44 ...
- android tcp socket框架_socket网络编程知识梳理,让你学会造轮子的能力
在前面几篇中,我给大家介绍了socket的相关知识,也给出了详细的代码,从socket的基本介绍,到IO多路复用,以及粘包拆包,最后到心跳包问题.总的来说大概都把socket网络编程中能碰见的问题都讲 ...
- 多实例多进程网络编程PHP,php socket网络编程基础知识(四):多进程
标签:status 传递 windows 返回 修改 队列 _for 响应 关联 说明 php在web编程时是不需要考虑多进程的,但整个php流程是涉及到多进程的,只不 ...
- python运维开发之socket网络编程01
python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...
- python网络通信框架_Python运维-Socket网络编程 (1)
Python socket 简介 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其 ...
- 网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
本文为学习笔记,整合课程内容以及下列文章: 其中,libcurl函数库常用字段解读部分: 参考博文:原文地址 作者:冬冬他哥哥 目录 Libcurl库简介 Libcurl等三方库的通用编译方法 三方库 ...
- 网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议
参考:简单了解HTTP协议与HTTPS协议 作者:丶PURSUING 发布时间: 2021-03-15 10:55:13 网址:https://blog.csdn.net/weixin_4474282 ...
- 网络编程知识预备(1) ——了解OSI网络模型
参考:简单了解OSI网络模型 作者:丶PURSUING 发布时间: 2021-03-18 20:07:09 网址:https://blog.csdn.net/weixin_44742824/artic ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...
- socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程
一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...
最新文章
- 转图像偏微分方程不适定问题
- 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)
- VTK:InfoVis之XGMLReader
- 东明县计算机学校,东明县职业中等专业学校2021年招生信息
- mysql 设置 character_set_server_MySQL:简单记录character_set_server影响参数
- IDEA 启动报错could not find main class com/intellij/idea/main解决办法
- ET游戏框架整理笔记3: 常用内置组件功能
- ASP.NET全局文件Global.asax用法分析
- 玩转 ESP32 + Arduino (十八) 采用SIM800L发送短信和定位(基础知识)
- 专访 Livid:程序员值得花时间一看!
- 论文阅读笔记(audio-visual相关)—Co-Separating Sounds of Visual Objects
- 适用于window平台的java虚拟机_雪豹系统安装说明
- 如何快速开通流量主,提升小程序UV访客
- iis下屏蔽php notice,apache、iis规则屏蔽拦截蜘蛛抓取
- 优秀logo设计解析_国外30个优秀的logo的设计思维分析
- 记唐晓芙---围城第一遍略读后记
- 倍福PLC和C#通过ADS通信传输bool类型变量
- MBR格式转GPT格式阿里云云盘在线扩容
- 西瓜白粉病怎么防治?司普沃告诉您个小妙招
- 电脑自动配置了两个IP4解决方法
热门文章
- pywinauto简单示例
- Python获取矢量文件属性表字段及类型
- mysql 跳过授权表_跳过授权表登录后使用replace into创建root权限用户
- Gson源码解析之InstanceCreator简单说明
- matlab双峰模型,为什么用MATLAB画的高斯双峰曲线不能永双高斯函数拟合?
- Glide4.0源码全解析(三),into()方法背后的故事
- 百度App网络深度优化系列《一》DNS优化
- recv函数阻塞_socket缓冲区以及阻塞模式详解
- python invalid character_python提示invalid character in identifier
- iphone mac地址是否随机_iPad 的 Mac 地址是否会随机更换,如何关闭呢