计算机网络——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.hqwc.cn/news/474054.html

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

相关文章

【STM32 CubeMX】SPI W25Q64功能实现

文章目录 前言一、内部函数的实现1.1 选中和取消选中SPI Flash1.2 写使能函数1.3 获取读状态1.4 等待就绪状态 二、Flash读写函数实现2.1 读Flash ID2.2 擦除某个扇区2.3 写扇区2.4 读数据 三、测试代码总结 前言 SPI Flash 存储器在嵌入式系统中扮演着重要角色,它…

vue_dev_tools工具下载安装打包

vue_dev_tools工具下载安装打包 一、简介二、安装方式2.1.安装图文2.2.打包工具 endl 一、简介 使用 Vue 时,在浏览器上安装 Vue Devtools Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌…

Linux CentOS stream 9 安装docker

在计算机技术中,虑拟化是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。 目前,大多数服务器的容量的利用率不足15%,这导致服务器数量激增以及增加了复杂性。服务…

C语言---指针进阶

1.字符指针 int main() {char str1[] "hello world";char str2[] "hello world";const char* str3 "hello world.";const char* str4 "hello world.";if (str3 str4){//常量字符串在内存里面是无法修改的,所以没必要…

RK3399平台开发系列讲解(USB篇)USB 枚举和断开过程

🚀返回专栏总目录 文章目录 一、连接与检测二、USB设备枚举三、断开过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍 USB 枚举/断开过程。 一、连接与检测 二、USB设备枚举 USB设备枚举一

Android 回退页面不是上个页面

问题 Android 回退页面不是上个页面 详细问题 笔者进行Android 开发&#xff0c;点击返回上一层&#xff0c;显示页面不是上个页面&#xff0c;而是之前的某个页面 页面跳转代码 private void navigateToActivity(Context context, Class<?> targetActivityClass) {I…

Google Gemini 1.5:引领跨模态AIGC信息分析理解与视频内容推理的新篇章,与 Open AI 决一高下!

Gemini 1.5具有100万token的上下文理解能力&#xff0c;是目前最强&#xff01;具有跨模态理解和推理&#xff1a;能够对文本、代码、图像、音频和视频进行高度复杂的理解和推理。允许分析1小时视频、11小时音频、超过30,000行代码或超过700,000字的文本。不过谷歌这个Gemini 1…

每日OJ题_算法_递归③力扣206. 反转链表

目录 力扣206. 反转链表 解析代码 力扣206. 反转链表 206. 反转链表 LCR 024. 反转链表 难度 简单 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,…

恢复被.target勒索病毒加密的数据文件:拒绝向.target勒索病毒支付赎金

引言&#xff1a; 在当今数字时代&#xff0c;勒索病毒已成为网络安全领域的一大威胁&#xff0c;而.target勒索病毒是其中引起广泛关注的一种变种。本文将深入探讨.target勒索病毒的特点以及被其加密的数据文件恢复方法。数据的重要性不容小觑&#xff0c;您可添加我们的技术…

记录 | 验证pytorch-cuda是否安装成功

检测程序如下&#xff1a; import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell&#xff0c;运行情况如下

使用 RAG 创建 LLM 应用程序

如果您考虑为您的文件或网站制作一个能够回应您的个性化机器人&#xff0c;那么您来对地方了。我可以帮助您使用Langchain和RAG策略来创建这样一个机器人。 了解ChatGPT的局限性和LLMs ChatGPT和其他大型语言模型&#xff08;LLMs&#xff09;经过广泛训练&#xff0c;以理解…

idm下载路径在哪 idm下载保存路径怎么设置 IDM下载器 internetdownloadmanager官方版下载 网络加速器

春节&#xff08;Spring Festival&#xff09;&#xff0c;是中国最隆重最富有特色的传统节日之一。春节期间我们与一家人团聚在一起&#xff0c;其乐融融。2024年春晚已经接近尾声了&#xff0c;很多人已经踏上了返程的路上。在部分地区&#xff0c;如春晚直播过程中或者网络高…