计算机网络——15套接字编程

套接字编程

Socket编程

Socket编程:应用进程使用传输层提供的服务才能够交换报文,实现应用协议,实现应用
TCP/IP:应用进程使用Socket API访问传输服务
地点:界面上的SAP
方式:Socket API

目标:学习如何构建能借助sockets进行通信的C/S应用程序
socke:分布式应用进程之间的门,传输层协议提供的端到端服务接口

在这里插入图片描述

2种传输层服务的socket类型

  • TCP:可靠的、字节流的服务
  • UDP:不可靠(数据UDP数据报)服务

TCP套接字编程

套接字:应用进程与端到端传输协议(TCP或UDP)之间的门户
TCP服务:从一个进程向另一个进程可靠的传输字节流

服务器首先运行,等待连接建立
服务器进程必须先处于运行状态

  • 创建欢迎socket
  • 和本地端口捆绑
  • 在欢迎socket上阻塞式等待接受用户的连接

客户端主动和服务器建立连接
创建客户端本地套接字(隐式捆绑到本地port)

  • 指定服务器进程的IP地址和端口号,与服务器进程连接

当与客户端连接请求到来时

  • 服务器接受来自客户端的请求,接触阻塞式等待,返回一个新的socket(与欢迎socket不一样),与客户端通信
    • 允许服务器与多个客户端通信
    • 使用的IP和源端口来区分不同的客户端

连接API调用有效时,客户端P与服务器之间建立了TCP连接

从应用程序的角度
TCP在客户端和服务器进程之间提供了可靠的、字节流(管道)服务

C/S模式的应用样例

  • 客户端从标准输入装置读取一行字符,发送给服务器
  • 服务器从socket读取字符
  • 服务器将字符串装换成大写,然后返回给客户端
  • 客户端从socket种读取一行字符,然后打印出来

实际上,这里描述了C-S之间交互的动作次序

数据结构sockaddr_in

IP地址和port捆绑关系的数据结构(标示进程的端节点)

struct socketaddr_in{short sin_family;   //AF_INETu_short sin_port;   //portstruct in_addr sin_addr;    //IP address unsigned longchar sin_zero[8];   //align
};
属性说明
sin_family地址簇,这个结构体不仅仅用于IP的通信,还可以用于其他的通信,这里设置为常量AF_INET,表明是TCP/IP的协议簇
sin_port端口号
sin_addrip地址
sin_zero起对其作用,因为ipx的地址长度比ip的长度,其他地址也是

数据结构hostent

域名和IP地址的数据结构

struct hostent { char *h_name;	//域名char **h_aliases;	//别名int h_addrtype;	int h_length; //地址长度char **h_addr_list;	//IP地址#define h_addr h_addr_list[0];
}; 
属性类型说明
h_name字符串主机域名
h_aliases字符串数组主机的一系列别名
h_addrtype
h_length数字地址长度
h_addr_list字符串数组ip地址,可以将其复制到sockaddr_in的ip中

作为调用域名解析函数时的参数 返回后,将IP地址拷贝到 sockaddr_in的IP地址部分

C/S socket交互:TCP

在这里插入图片描述

例子:C客户端(TCP)

// client.c
void main(int argc, char *argv[]) {// sad表示 server addrstruct sockaddr_in sad; /* structure to hold an IP address of server */int clientSocket; /* socket descriptor */struct hostent *ptrh; /* pointer to a host table entry */char Sentence[128];char modifiedSentence[128];//	argv[0]是程序的名字host = argv[1]; // argv[1] 表示服务器的域名port = atoi(argv[2]); // argv[2]表示服务端的端口clientSocket = socket(PF_INET, SOCK_STREAM, 0);// 这里底层自动使用了bind// sad先清0memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */sad.sin_family = AF_INET; /* set family to Internet */// port先转换成短整形,然后设置成网络次序sad.sin_port = htons((u_short)port);ptrh = gethostbyname(host);/* Convert host name to IP address *///将IP地址拷贝到sad.sin_addrmemcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);connect(clientSocket, (struct sockaddr *)&sad, sizeof(sad));gets(Sentence); // get input stream from clientn=write(clientSocket, Sentence, strlen(Sentence)+1); // send line to servern=read(clientSocket, modifiedSentence, sizeof(modifiedSentence)); // read line from serverprintf("FROM SERVER: %s\n",modifiedSentence);close(clientSocket);  // close the connection
}

例子:C服务器(TCP)

// server.c
void main(int argc, char *argv[]) {// 只有一个参数,就是服务端的端口号struct sockaddr_in sad; /* structure to hold an IP address of server*/struct sockaddr_in cad; /*client */int welcomeSocket, connectionSocket; /* socket descriptor */struct hostent *ptrh; /* pointer to a host table entry */char clientSentence[128];char capitalizedSentence[128];// portport = atoi(argv[1]);welcomeSocket = socket(PF_INET, SOCK_STREAM, 0);memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */sad.sin_family = AF_INET; /* set family to Internet */sad.sin_addr.s_addr = INADDR_ANY; /* set the local IP address */sad.sin_port = htons((u_short)port);/* set the port number */// 此处赋值,在表中进行赋值bind(welcomeSocket, (struct sockaddr *)&sad, sizeof(sad));// specify the maximum number of clients that can be queuedlisten(welcomeSocket, 10)while(1) {connectionSocket=accept(welcomeSocket, (struct sockaddr *)&cad, &alen);n=read(connectionSocket, clientSentence, sizeof(clientSentence));// capitalize Sentence and store the result in capitalizedSentencen=write(connectionSocket, capitalizedSentence, strlen(capitalizedSentence)+1);close(connectionSocket);}
}

UDP Socket编程

UDP在客户端和服务器之间没有连接

  • 没有握手
  • 发送端在每一个报文中明确地指明目标的IP地址和端口号
  • 服务器必须从收到的分组中提取出发送端的IP地址和端口号

传送的数据可能乱序,也可能丢失

进程视角看UDP服务
UDP为客户端和服务器提供不可靠的字节组的传送服务

C/S交互:UDP

在这里插入图片描述

例子:C客户端

/* client.c */
void main(int argc, char *argv[])
{struct sockaddr_in sad; /* structure to hold an IP address */int clientSocket; /* socket descriptor */struct hostent *ptrh; /* pointer to a host table entry */char Sentence[128];char modifiedSentence[128];host = argv[1]; port = atoi(argv[2]);clientSocket = socket(PF_INET, SOCK_DGRAM, 0);/* determine the server's address */memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */sad.sin_family = AF_INET; /* set family to Internet */sad.sin_port = htons((u_short)port);ptrh = gethostbyname(host);/* Convert host name to IP address */memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);gets(Sentence);addr_len =sizeof(struct sockaddr);n=sendto(clientSocket, Sentence, strlen(Sentence)+1, (struct sockaddr *) &sad, addr_len);n=recvfrom(clientSocket, modifiedSentence, sizeof(modifiedSentence),(struct sockaddr *) &sad, &addr_len);printf("FROM SERVER: %s\n",modifiedSentence);close(clientSocket);
}

例子:C服务器

/* server.c */
void main(int argc, char *argv[])
{struct sockaddr_in sad; /* structure to hold an IP address */struct sockaddr_in cad;int serverSocket; /* socket descriptor */struct hostent *ptrh; /* pointer to a host table entry */char clientSentence[128];char capitalizedSentence[128];port = atoi(argv[1]);serverSocket = socket(PF_INET, SOCK_DGRAM, 0);memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */sad.sin_family = AF_INET; /* set family to Internet */sad.sin_addr.s_addr = INADDR_ANY; /* set the local IP address */sad.sin_port = htons((u_short)port);/* set the port number */bind(serverSocket, (struct sockaddr *)&sad, sizeof(sad));while(1) {n=recvfrom(serverSocket, clientSentence, sizeof(clientSentence), 0(struct sockaddr *) &cad, &addr_len );/* capitalize Sentence and store the result in capitalizedSentence*/n=sendto(serverSocket , capitalizedSentence, strlen(capitalizedSentence)+1,(struct sockaddr *) &cad, &addr_len);}
}

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

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

相关文章

将其它输入法的词库转换为微软拼音输入法的自学习词库

上班第一天,我删除了搜狗输入法 曾几何时,搜狗拼音输入法,以丰富的词库,实用的设置成为我电脑端主要的中文输入法。但新年上班的第一天,我彻底删除了它,回归到微软拼音输入法。因为,最近&#…

java面试微服务篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

CSS画一个三角形(面试必问)

目录 一、前言二、实现过程三、原理分析参考文献 一、前言 在前端开发的时候,我们有时候会需要用到一个三角形的形状,比如地址选择或者播放器里面播放按钮 通常情况下,我们会使用图片或者svg去完成三角形效果图,但如果单纯使用cs…

七、ActiveMQ的传输协议

ActiveMQ的传输协议 一、是什么二、协议1.TCP(默认)2.NIO3.AMQP4.STOMP5.SSL6.MQTT7 WS 三、NIO配置案例1.修改activemq.xml2.重启3.生产者/消费者4.性能提升4.1 配置4.2 生产者/消费者 一、是什么 官网地址:http://activemq.apache.org/configuring-version-5-tra…

[嵌入式系统-27]:RT-Thread -14- 操作系统配置:rtconfig.h文件与menuconfig命令

目录 一、rtconfig.h 1.1 概述 1.2 软硬件资源配置 1.3 功能模块选择 1.4 内核配置详解 1.5 调度器配置 1.6 硬件设备驱动配置 1.7 网络配置 1.8 调试配置 二、menuconfig 2.1 概述 2.2 主要功能 三、RT Thread配置 VS Linux配置 一、rtconfig.h 1.1 概述 rtco…

电商API接口|大数据关键技术之数据采集发展趋势

在大数据和人工智能时代,数据之于人工智能的重要性不言而喻。今天,让我们一起聊聊数据采集相关的发展趋势。 本文从电商API接口数据采集场景、数据采集系统、数据采集技术方面阐述数据采集的发展趋势。 01 数据采集场景的发展趋势 作为大数据和人工智…

前端工程化面试题 | 13.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

17.Qt 单选框相关操作

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 布置界面 2.管理 3.槽函数 参考&#xff1a; 前言&#xff1a; 组合选择只能选择一个的单选框实现&#xff0c;以及管理组合单选框 技能&#xff1a; <QRadioButton> <QButtonGroup> 内容&…

GPT SOVITS项目 一分钟克隆 (文字输出)

步骤流程&#xff1a;&#xff08;首先使用UVR 提取人声文件&#xff0c;然后按下面步骤进行&#xff09; 注意这里提交的音频是参考的音频

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容&#xff0c;本章回中将介绍characters包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

C高级D5作业

1.#!/bin/bash read -p "请输入一个字符>>" -n 1 c echo case $c in [[:lower:]]) echo "小写" ;; [[:upper:]]) echo "大写" ;; [1-9]) echo "数字" ;; …

使用MinIO S3存储桶备份Weaviate

Weaviate 是一个开创性的开源向量数据库&#xff0c;旨在通过利用机器学习模型来增强语义搜索。与依赖关键字匹配的传统搜索引擎不同&#xff0c;Weaviate 采用语义相似性原则。这种创新方法将各种形式的数据&#xff08;文本、图像等&#xff09;转换为矢量表示形式&#xff0…

OpenGL学习——14.投光物_点光源

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

JDK新特性

JDK新特性 函数式接口和Lambda 表达式Stream流操作新日期API操作其他新特性 Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda表达式理解为是一段可以传递的代码&#xff08;将代码 像数据一样进行传递&#xff09;。可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码…

openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优

文章目录 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优222.1 前提条件222.2 内存相关参数设置222.3 网络相关参数设置222.4 I/O相关参数设置 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优 在性能调优过程中&#xff0c;可以根据…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…

【设计模式】使用装饰器模式对价格计算功能做灵活的拓展

文章目录 1. 概述2.实现方式2.1.原始商品类及计算接口2.2.加入装饰器2.3.装饰器的组合使用 3.总结 1. 概述 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型的设计模式&#xff0c;使用组合的方式来替代了继承&#xff0c;它的核心作用是在不修改对象本身的…

值得收藏的的适用于 Windows 11 的免费数据恢复软件榜单

终于要说到Windows 11了&#xff0c;有太多令人惊叹的功能&#xff0c;让人跃跃欲试。但是&#xff0c;在升级到 Windows 11 或使用 Windows 11 时&#xff0c;人们可能会因计算机问题而导致文件被删除或丢失。这就是为什么需要 Windows 11 的免费文件恢复的原因。这是适用于 W…

Intelij Terminal中文乱码解决

第一&#xff1a; &#xff08;重启Intelij生效&#xff09; -Dfile.encodingUTF-8 第二&#xff1a; &#xff08;重启Intelij生效&#xff09; 如果还不行&#xff0c;第三&#xff1a; 测试结果很ok&#xff1a;

备战蓝桥杯---图论之最小生成树

首先&#xff0c;什么是最小生成树&#xff1f; 他就是无向图G中的所有生成树中树枝权值总和最小的。 如何求&#xff1f; 我们不妨采用以下的贪心策略&#xff1a; Prim算法&#xff08;复杂度&#xff1a;&#xff08;nm)logm)&#xff1a; 我们对于把上述的点看成两个集…