二、网编之初识Socket套接字结构体

二、初识Socket套接字结构体



1、通用套接字结构体类型

   struct sockaddr
    {
        sa_family_t sa_family; //协议簇
        char sa_data[14]; //协议簇数据
    }

通用套接字结构体可以在不同的协议簇之间进行强制转化,Socket网络编程中几乎所有套接字API函数的形参都是通用套接字结构体struct sockaddr。

存在问题:

  • 通用套接字结构体对编程的角度来说,设置很不方便,我们以以太网协议来说,当要设置端口号、IP地址等,那么我需要将端口号与IP地址进行数据组合绑定,然后赋值给该结构,是不能独立赋值。

  • 为解决上述问题,以太网协议中经常用到的是下述结构体,这样就可以给人以直观的方式去填充套接字结构体。


2、以太网套接字结构体

struct sockaddr_in
    {
        u8 sin_len;
        u8 sin_family;
        u16 sin_port;
        struct in_addr sin_addr;
        char sin_zero[8];
    }
结构体成员 参数含义 备注
u8 sin_len 结构体sockaddr_in的长度 一般大小为固定16字节
u8 sin_family 协议族类型 见下表
u16 sin_port 16位端口号 XXX
struct in_addr sin_addr 32位IP地址 INADDR_ANY //表示可以与任何主机通信
char sin_zero[8] //未使用 填充位,一般都设置为0
协议簇类型(sin_family) 参数含义
AF_INET 以太网/IPv4协议
AF_INET6 以太网/IPv6协议
AF_LOCAL Unix域协议
AF_ROUTE 路由套接口
AF_KEY 密钥套接口

Note : 我们主要使用的是以太网,所以sin_family成员一般都为AF_INET ,有时候我们看到协议簇类型是PF_* 而不是 AF*,这是因为glibc的实现机制是posix,其实都是同一个东西。



存在问题:

  • Socket网络编程中几乎所有套接字API函数的形参都是通用套接字结构体struct sockaddr,而我们初始化传递的参数是以太网套接字结构体struct sockaddr类型,这样是否就存在类型不一致的问题?
Exzampp:
  // API函数: fun(struct sockaddr)
 //  用户实际调用:
 int main()
 {
     struct sockaddr_in;
     fun(sockaddr_in);    //是否存在问题?
 }
     

问题解答:

  • 上述操作完全可以,因为这两个结构体在内存上的大小完全一致都是16个字节,所以隐式的转换不存在其它问题。
  • struct sockaddr = struct sockaddr_in 。 (不存在问题)


  *图示:两种结构类型的内存存储*

原文地址:https://www.cnblogs.com/retry/p/9291208.html

时间: 2024-08-10 00:26:37

二、网编之初识Socket套接字结构体的相关文章

Socket 套接字和解决粘包问题

---恢复内容开始--- Socket 套接字: 什么是socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实 就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口 就是全部,让Socket去组织数据,以符合指定的协议. socket在OSI模型中的位置 二为什么需要socket 在标准的OIS模型中并没有规定说必须有socket层,也就是说不使用socket也能完成通讯,是的,的

python之socket(套接字)

一.客户端/服务器架构 1.1基本概念 客户端/服务器架构即:C/S架构,包括: (1)硬件C/S架构(打印机) (2)软件C/S架构(Web服务器) 1.2举例 生活中的C/S架构:饭店为S端,所有食客C端 二.TCP/udp/osi七层 2.1TCP/UDP协议 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:电子邮件.文件传输程序. UDP(U

socket 套接字编程

目录 SOCKET 一.基于TCP协议的socket套接字编程 1.1 什么是socket 1.2 套接字分类 1.3 套接字工作流程 二.基于udp协议的套接字编程 三.UDP协议和TCP协议的区别 3.1 udp协议的特点 3.2 UDP和TCP的区别 SOCKET 一.基于TCP协议的socket套接字编程 1.1 什么是socket ? socket是应用层和传输层之间的一个抽象层,我们经常把socket称为套接字,它是一组接口,把TCP/IP层的复杂操作抽象为几个简单的接口供应用层调用

基于TCP协议的socket套接字编程

基于TCP协议的socket套接字编程 一.什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. [ 注意:也有

基于UDP协议的socket套接字编程

基于UDP协议的socket套接字编程 一.UDP套接字简单示例 1.1 服务器 import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议->UDP server.bind(('127.0.0.1', 8080)) while True: data, client_addr = server.recvfrom(1024) print('===>', data, client_addr) ser

网络编程socket套接字及其使用(六)

今天继续深入学习socket套接字的使用,上一篇文章我们主要深入介绍了如何使用套接字进行面向连接的通信编程,这里我们主要深入讲解一下基于面向非连接的编程. 对于TCP面向连接来说,在通信前,需要经过三步握手协议以建立连接,而建立连接的过程往往比较耗费时间.连接建立后,在聊天过程中,可能经过好吃一段时间,聊天的双方才会说一句话(网速比较慢的情况比较常见),那么连接是一个保存还是应先断开,等对方说话时再建立连接呢?也就是说,TCP协议的面向连接.数据确认和重传机制将会影响聊天的效率.所以我们就有必要

TCP协议与socket套接字

一.TCP协议 TCP协议建立双向通道 1.三次握手,建立连接: 客户端向服务端发送建立连接的请求  服务端返回收到请求的信息给客户端,并且发送往客户端建立连接的请求  客户端接收到服务端发来的请求,返回接成功给服务端,完成双向连接 2.反馈机制: 客户端往服务端发送请求,服务端必须返回响应, 告诉客户端收到请求了,并且将服务端的数据一并返回给客户端. 洪水攻击:指的是通过伪造大量的请求,往对方服务器发送请求,导致对方服务器响应跟不上,以至于瘫痪. 半连接池listen: 限制用户在同一个时间段

网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

TCP协议:三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立连接的请求 3:客户端接收到服务端发来的请求,返回接成功给服务端,完成双向连接 第一客戶向服务端发送请求,请求建立连接 服务端同客户端的请求,并同时向客户端发送建立 连接的请求,最后客户端同意后建立 双向连接. C ----> S C <---- S - 反馈机制: 客户端往服务端发送请求,服务端必须返回响应, 告诉客户

socket 套接字通信

一.什么是socket?socket是一个模块, 又称套接字,用来封装 互联网协议(应用层以下的层). 二.为什么要有socket?socket可以实现互联网协议 应用层以下的层 的工作,提高开发效率. 三.怎么使用socket?import socket写socket套接字: ClientServer使用如下:client.py '''启动服务端后再启动客户端'''import socket #1.买手机client = socket.socket() #拿到一个手机对象 #2.拨号clien