网络编程-认识套接字socket

文章目录

      • 套接字概念
        • 端口号
        • 网络字节序
      • 套接字类型
        • 流套接字
        • 数据报套接字
      • socket常见API
        • socket函数
        • bind函数
        • listen函数
        • accept函数
        • connect函数
        • sockaddr结构

套接字概念

  socket套接字是进程之间一种通信机制,通过套接字可以在不同进程之间进行数据交流。在TCP/UDP中,“IP+TCP或UDP端口号”可以唯一标识网络通讯中的一个进程,“IP地址+端口号”就是一个socket套接字。
在这里插入图片描述

端口号

  端口号是一个2字节的16位整数,用来标识一个进程,它告诉操作系统 当前这个数据要交给哪个进程来处理。一个端口号只能被一个进程占用,但是一个进程可以有多个端口号。

网络字节序

  TCP/IP协议规定,网络数据流采用大端字节序(高位字节数据存放在内存低地址数,低位字节数据存放在内存高地址数)。不管这台主机是大端机还是小端机都是按照大端字节序来接收数据,不过小端机需要转换一下。

套接字类型

流套接字

  流套接字提供了一个可靠的、面向连接的通信机制,可以顺序地传输数据。在TCP/IP协议中,TCP协议采用的就是流套接字。

数据报套接字

  数据报套接字提供了一种无连接、不可靠的通信机制,数据以独立的数据包形式传输。在TCP/IP协议中,UDP协议采用的就是数据报套接字。

socket常见API

  socket API是一层抽象的网络编程接口,适用于各种底层网络协议。

socket函数
// 创建socket文件描述符(TCP/UDP。客户端+服务器)
int socket(int domain,int type, int protocol);
domain:AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址AF_INET6 与上面类似,不过是来用IPv6的地址AF_UNIX 本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器在同一台及其上的时候使用
type:SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。SOCK_SEQPACKET该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。SOCK_RAW socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序
protocol:传0 表示使用默认协议。
返回值:成功:返回指向新创建的socket的文件描述符,失败:返回-1,设置errno
bind函数
// 绑定端口号(TCP/UDP,服务器)
int bind(int sockfd const struct sockaddr *address, socklen_t address_len);
sockfd:socket文件描述符
address:构造出IP地址加端口号
addrlen:sizeof(address)长度
返回值:成功返回0,失败返回-1, 设置errno服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。bind()的作用是将参数sockfd和addr绑定在一起,使sockfd这个用于网络通讯的文件描述符 监听addr所描述的地址和端口号。struct sockaddr *是一个通用指针类型,addr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度。
listen函数
// 开始监听socket(TCP,服务器)
int listen(int sockfd, int backlog);
sockfd:socket文件描述符
backlog:挂起的连接队列的最大长度
返回值:成功返回0,失败返回-1
accept函数
// 接收请求(TCP,服务器)
int accept(int sockfd, struct sockaddr* address, socklen_t* address_len);
sockdf:socket文件描述符
address:传出参数,返回链接客户端地址信息,含IP地址和端口号
addrlen:sizeof(address)长度
返回值:成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno当socket模式设置为阻塞,accept函数的功能是阻塞等待client发起三次握手,当3次握手完成的时候,accept解除阻塞,并从全连接队列中取出一个socket,就可以对这个socket连接进行读写操作
connect函数
// 建立连接(TCP,客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockdf:socket文件描述符
addr:传入参数,指定服务器端地址信息,含IP地址和端口号
addrlen:传入参数,传入sizeof(addr)大小
返回值:成功返回0,失败返回-1,设置errno调用connect函数将激发TCP的三次握手过程,而且仅在连接建立成功或出错时才返回
sockaddr结构

  sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了。sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把p目标地址和端口号分开储存在两个变量中。
sockaddr结构

struct sockaddr
{__SOCKADDR_COMMON (sa_);char sa_data[14];
};

sockaddr_in结构

typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};struct sockaddr_in
{__SOCKADDR_COMMON (sin_);in_port_t sin_port;struct in_addr sin_addr;unsigned char sin_zero[sizeof(struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof(in_port_t) -sizeof(struct in_addr)];
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux应急响应基础和常用命令

linux应急响应 linux应急响应基础和常用命令基于linux系统本身进行应急响应。 系统基础信息获取 获取linux服务器基本信息 命令&#xff1a; uname -a内存cpu信息 cat /proc/cpuinfo cat /proc/meminfo lscpu free -m lsmod #查看载入的模块信息进程查看 动态进程查看 …

设计模式——装饰模式(结构型)

引言 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 假设你正在开发一个提供通知功能的库&#xff0c; 其他程序可使用它向用户发送关于重要事件的通知。 库的最初版本基于 通知器Notifier类&#xff0c;…

Sherlock:社交媒体账号搜索工具 | 开源日报 No.111

sherlock-project/sherlock Stars: 45.1k License: MIT 这个项目是一个社交媒体账号搜索工具&#xff0c;名为 Sherlock。它可以通过用户名在不同的社交网络上追踪用户的账号。 支持单个或多个用户搜索提供 Docker 容器化部署方式开放源代码并欢迎贡献者参与开发包含详细测试…

101基于matlab的极限学习机ELM算法进行遥感图像分类

基于matlab的极限学习机ELM算法进行遥感图像分类&#xff0c;对所获取的遥感图片进行初步分类和最终分类。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 101matlab遥感图像分类模式识别 (xiaohongshu.com)

[ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证

文章目录 一、前言二、在 Azure Portal 中创建 VM三、验证已创建的虚拟机资源3.1 方法一&#xff1a;在虚拟机服务中查看验证3.1 方法二&#xff1a;在资源组服务中查看验证 四、文末总结 一、前言 本文会开始创建新系列的专栏&#xff0c;专门更新 Azure 云实践相关的文章。 …

JavaWeb笔记之JavaWeb JDBC

//Author 流云 //Version 1.0 一. 引言 1.1 如何操作数据库 使用客户端工具访问数据库&#xff0c;需要手工建立连接&#xff0c;输入用户名和密码登录&#xff0c;编写 SQL 语句&#xff0c;点击执行&#xff0c;查看操作结果&#xff08;结果集或受影响行数&#xff09;。…

电子电器架构( E/E) 演化 —— 大算力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

git 上传大文件操作 lfs 的使用

我们要先去下载 下载后安装 我最后还是下载到了D:\git\Git\bin这个目录下 如何检查是否下载成功呢&#xff0c;用 git lfs install 在命令行运行就可以查看 下面怎么上传文件呢 首先我们还是要初始化文件的 git init 下一步输入命令 git lfs install 下一步 git lfs tra…

ReenterLock重入锁

synchronized就是一种最简单的控制方法&#xff0c;它决定了一个线程释放可以访问临界区资源。 同时&#xff0c;Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

【数据分享】2019-2023年我国区县逐年新房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现&#xff0c;一个区域的房价越高通常代表这个区域越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享了2019—2023年我国区县逐月的新房房价数据&a…

EasyExcel 简单导入

前边写过使用easyexcel进行简单、多sheet页的导出。今天周日利用空闲写一下对应简单的导入。 重点&#xff1a;springboot、easyExcel、桥接模式&#xff1b; 说明&#xff1a;本次使用实体类student&#xff1a;属性看前边章节内容&#xff1b; 1、公共导入service public …

VR虚拟现实的七大应用领域

一、工业领域 园区利用虚拟现实技术优化生产管理与节能减排&#xff0c;实现提质增效降本。发展支持多人协作和模拟仿真的虚拟现实开放式服务平台&#xff0c;打通产品设计与制造环节&#xff0c;构建虚实融合的远程运维新型解决方案&#xff0c;适配各类先进制造技术的员工技…