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.harpa/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网络编程知识相关推荐

  1. 网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

    参考:SOCKET,TCP,HTTP之间的区别与联系 作者:丶PURSUING 发布时间: 2021-03-19 11:54:01 网址:https://blog.csdn.net/weixin_44 ...

  2. android tcp socket框架_socket网络编程知识梳理,让你学会造轮子的能力

    在前面几篇中,我给大家介绍了socket的相关知识,也给出了详细的代码,从socket的基本介绍,到IO多路复用,以及粘包拆包,最后到心跳包问题.总的来说大概都把socket网络编程中能碰见的问题都讲 ...

  3. 多实例多进程网络编程PHP,php socket网络编程基础知识(四):多进程

    标签:status   传递   windows   返回   修改   队列   _for   响应   关联 说明 php在web编程时是不需要考虑多进程的,但整个php流程是涉及到多进程的,只不 ...

  4. python运维开发之socket网络编程01

    python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...

  5. python网络通信框架_Python运维-Socket网络编程 (1)

    Python socket 简介 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其 ...

  6. 网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页

    本文为学习笔记,整合课程内容以及下列文章: 其中,libcurl函数库常用字段解读部分: 参考博文:原文地址 作者:冬冬他哥哥 目录 Libcurl库简介 Libcurl等三方库的通用编译方法 三方库 ...

  7. 网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议

    参考:简单了解HTTP协议与HTTPS协议 作者:丶PURSUING 发布时间: 2021-03-15 10:55:13 网址:https://blog.csdn.net/weixin_4474282 ...

  8. 网络编程知识预备(1) ——了解OSI网络模型

    参考:简单了解OSI网络模型 作者:丶PURSUING 发布时间: 2021-03-18 20:07:09 网址:https://blog.csdn.net/weixin_44742824/artic ...

  9. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  10. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

最新文章

  1. 转图像偏微分方程不适定问题
  2. 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)
  3. VTK:InfoVis之XGMLReader
  4. 东明县计算机学校,东明县职业中等专业学校2021年招生信息
  5. mysql 设置 character_set_server_MySQL:简单记录character_set_server影响参数
  6. IDEA 启动报错could not find main class com/intellij/idea/main解决办法
  7. ET游戏框架整理笔记3: 常用内置组件功能
  8. ASP.NET全局文件Global.asax用法分析
  9. 玩转 ESP32 + Arduino (十八) 采用SIM800L发送短信和定位(基础知识)
  10. 专访 Livid:程序员值得花时间一看!
  11. 论文阅读笔记(audio-visual相关)—Co-Separating Sounds of Visual Objects
  12. 适用于window平台的java虚拟机_雪豹系统安装说明
  13. 如何快速开通流量主,提升小程序UV访客
  14. iis下屏蔽php notice,apache、iis规则屏蔽拦截蜘蛛抓取
  15. 优秀logo设计解析_国外30个优秀的logo的设计思维分析
  16. 记唐晓芙---围城第一遍略读后记
  17. 倍福PLC和C#通过ADS通信传输bool类型变量
  18. MBR格式转GPT格式阿里云云盘在线扩容
  19. 西瓜白粉病怎么防治?司普沃告诉您个小妙招
  20. 电脑自动配置了两个IP4解决方法

热门文章

  1. pywinauto简单示例
  2. Python获取矢量文件属性表字段及类型
  3. mysql 跳过授权表_跳过授权表登录后使用replace into创建root权限用户
  4. Gson源码解析之InstanceCreator简单说明
  5. matlab双峰模型,为什么用MATLAB画的高斯双峰曲线不能永双高斯函数拟合?
  6. Glide4.0源码全解析(三),into()方法背后的故事
  7. 百度App网络深度优化系列《一》DNS优化
  8. recv函数阻塞_socket缓冲区以及阻塞模式详解
  9. python invalid character_python提示invalid character in identifier
  10. iphone mac地址是否随机_iPad 的 Mac 地址是否会随机更换,如何关闭呢