《TCP/IP网络编程》第3,4章学习记录

基础知识: 

struct sockaddr_in
{sa_family_t	sin_family;	//地址族(Address Family)uint16_t	sin_port;	//16位TCP/UDP端口号struct in_addr	sin_addr;	//32位IP地址char		sin_zero[8];	//不使用
}sa_family_t包括:
(1)AF_INET,IPv4网络协议使用的地址族
(2)AF_INET6,IPv6网络协议使用的地址族
(3)AF_LOCAL,本地通信中采用的UNIX协议的地址族
...etc...struct in_addr{in_addr_t	s_addr;		//32位IPV4地址
}in_addr_t:IP地址,声明为uint32_tstruct sockaddr
{sa_family_t	sin_family;	//地址族(Address Family)char		sa_data[14];	//地址信息
}
14=2+4+8字节sin_port,sin_addr均以网络字节序保存。在0x20号开始的地址中保存4字节int型数0x12345678.
大端序:高位字节放在低位地址。
0x20:0x12
0x21:0x34
0x22:0x56
0x23:0x78
小端序:高位字节放在高位地址。
0x20:0x78
0x21:0x56
0x22:0x34
0x23:0x12目前主流的Intel系列CPU以小端序方式保存数据。网络字节序:大端序。htons
ntohs
htonl
ntohl
h:host:主机
n:network:网络
s:short:linux中是2个字节
l:long:linux中是4个字节

字节序相关代码:

主机字节序转网络字节序:

#include <stdio.h>
#include <arpa/inet.h>int main(int argc,char *argv[])
{unsigned short host_port=0x1234;unsigned short net_port;unsigned long host_addr=0x12345678;unsigned long net_addr;net_port=htons(host_port);net_addr=htonl(host_addr);printf("Host ordered port:%#x \n",host_port);printf("Network ordered port:%#x \n",net_port);printf("Host ordered address:%#lx \n",host_addr);printf("Network ordered address:%#lx \n",net_addr);return 0;
}

结果:

 函数:

点分10进制转32位大端序整型数

in_addr_t inet_addr(const char *string);
成功时返回32位大端序整数型值,失败时返回INADDR_NONE;

样例:

#include <stdio.h>
#include <arpa/inet.h>int main(int argc, char *argv[])
{char *addr1="1.2.3.4";char *addr2="1.2.3.256";unsigned long conv_addr=inet_addr(addr1);if(conv_addr ==INADDR_NONE)printf("Error occured!\n");elseprintf("Network ordered integer addr: %#lx \n",conv_addr);conv_addr=inet_addr(addr2);if(conv_addr ==INADDR_NONE)printf("Error occured!\n");elseprintf("Network ordered integer addr: %#lx \n",conv_addr);return 0;
}

结果: 

 

函数:

点分10进制字符串转32位大端序整型数,存储在struct in_addr中

int inet_aton(const char * string,struct in_addr * addr);
成功时返回1,失败时返回0.

样例:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>void error_handling(char *message);int main(int argc ,char *argv[])
{char *addr="127.232.124.79";struct sockaddr_in addr_inet;if(!inet_aton(addr,&addr_inet.sin_addr))error_handling("Conversion error");elseprintf("Network ordered integer addr: %#x \n",addr_inet.sin_addr.s_addr);return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

结果:

 Linux下:

迭代服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 1024
void error_handling(char * message);int main(int argc,char * argv[])
{int serv_sock,clnt_sock;char message[BUF_SIZE];int str_len,i;struct sockaddr_in serv_addr,clnt_addr;socklen_t clnt_adr_sz;if(argc!=2){printf("Usage: %s <port>\n",argv[0]);exit(1);}serv_sock=socket(PF_INET,SOCK_STREAM,0);if(serv_sock==-1)error_handling("socker() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);serv_addr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)error_handling("bind() error");if(listen(serv_sock,5)==-1)error_handling("listen() error");clnt_adr_sz=sizeof(clnt_addr);for(int i=0;i<5;i++){clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_adr_sz);if(clnt_sock==-1)error_handling("accept() error");elseprintf("Connected client %d\n",i+1);while((str_len=read(clnt_sock,message,BUF_SIZE))!=0)write(clnt_sock,message,str_len);close(clnt_sock);}close(serv_sock);return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

回声客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024void error_handling(char * message);int main(int argc,char *argv[])
{int sock;struct sockaddr_in serv_addr;char message[BUF_SIZE];int str_len;if(argc!=3){printf("Usage : %s <IP> <port>\n",argv[0]);exit(1);}sock=socket(PF_INET,SOCK_STREAM,0);if(sock == -1)error_handling("socket() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr(argv[1]);serv_addr.sin_port=htons(atoi(argv[2]));if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)error_handling("connect() error!");else puts("Connected......");while(1){fputs("Input message(Q to quit):",stdout);fgets(message,BUF_SIZE,stdin);if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))break;write(sock,message,strlen(message));str_len=read(sock,message,BUF_SIZE-1);message[str_len]=0;printf("Message from server : %s \n",message);}close(sock);return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

实现效果:

服务器端等待队列大小为5,意思是可以有5个客户端发起connect连接,它们的连接请求会被注册到服务器端等待队列,但只有第一个客户端会与服务器通信,后面的必须等待上一个客户端结束通信才可建立连接。

 

 但因为TCP不存在数据边界

所以可能

write了好几次,却一次到达

read了好几次,却一次把数据都读了出来

也可能write了一次,却几次才到达

read了一次,却几次才把数据读完

(这是上面的程序存在的问题)

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

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

相关文章

Linux宝塔Mysql读写分离配置,两台服务器,服务器存在多个库

Linux宝塔Mysql读写分离配置&#xff0c;两台服务器&#xff0c;服务器存在多个库 一、主库操作 #登录数据库&#xff0c;用root登录方便&#xff0c;用其他账号会提示权限不足&#xff0c;需要登录root给予权限 mysql -u root -p 密码#创建一个账号&#xff0c;供从库用该账…

大屏项目也不难

项目环境搭建 使用create-vue初始化项目 npm init vuelatest准备utils模块 业务背景&#xff1a;大屏项目属于后台项目的一个子项目&#xff0c;用户的token是共享的 后台项目 - token - cookie 大屏项目要以同样的方式把token获取到&#xff0c;然后拼接到axios的请求头中…

网络编程 socket

目录 网络编程 套接字&#xff08;socket&#xff09;1. 认识端口号2. TCP协议3. UDP协议4. 网络字节序列5. 常见的套接字6. socket编程接口6.1 socket常见APIsocket函数recvfrom函数sendto函数read函数 从tcp socket中读取接收数据 6.2 sockaddr结构6.3 地址转换函数6.4 udp s…

JVM内存结构—— 程序计数器,虚拟机栈 解析

JVM的内存结构 1. 程序计数器(PC Register )寄存器 1.1 全称:Program Counter Register 1.2 作用 首先,java源代码 被 编译成 二进制的 字节码 (jvm指令) jvm跨平台就是这一套指令,linux 下,windows下指令都是一致的 指令 经过 解释器 把每一条指令 解释成 机器码…

SpringBoot项目从0到1配置logback日志打印

大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 以下是正文&#xff01; 一、写文背景 我们在写后端…

安卓进度条:ProgressBar和Seekbar

一、ProgressBar进度条介绍 ProgressBar 是 Android 中的一个进度条控件&#xff0c;用于显示正在进行的任务的进度。它可以以水平或圆形的形式展示进度&#xff0c;并提供了多种样式和属性来满足不同的需求。 相关属性&#xff1a; android:progress&#xff1a;设置进度条的…

计数排序

计数排序 排序步骤 1、以最大值和最小值的差值加一为长度创建一个新数组 2、将索引为0对应最小值&#xff0c;索引为1对应最小值1&#xff0c;索引为2对应最小值2&#xff0c;以此类推&#xff0c;将索引对应最小值到最大值之间所有的值 3、遍历一遍&#xff0c;遇到一个数字…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

云计算相关概念

文章目录 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云--区别和特性二、华为云&#xff1a;简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客&#xff1a;IaaS、PaaS、SaaS 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云–…

webpack插件安装

webpack插件安装 1、html-webpack-plugin插件2 、css-loader和style-loader插件3、less-load插件 1、html-webpack-plugin插件 1、下载插件 yarn add html-webpack-plugin -D2、webpack.config.js添加配置 *const HtmlWebpackPlugin require(html-webpack-plugin); const p…

SpringBoot+JWT实现单点登录解决方案

一、什么是单点登录? 单点登录是一种统一认证和授权机制&#xff0c;指在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的系统&#xff0c;不需要重新登录验证。 单点登录一般用于互相授信的系统&#xff0c;实现单一位置登录&#xff0c;其他信任的…

机器学习技术(五)——特征工程与模型评估

机器学习技术&#xff08;五&#xff09;——特征工程与模型评估(2️⃣) 文章目录 机器学习技术&#xff08;五&#xff09;——特征工程与模型评估(:two:)二、模型评估1、Accuracy score2、Confusion matrix混淆矩阵1、多值2、二值 3、Hamming loss4、Precision, recall and F…

深度学习笔记之Transformer(八)Transformer模型架构基本介绍

机器学习笔记之Transformer——Transformer模型架构基本介绍 引言回顾&#xff1a;简单理解&#xff1a; Seq2seq \text{Seq2seq} Seq2seq模型架构与自编码器自注意力机制 Transformer \text{Transformer} Transformer架构关于架构的简单认识多头注意力机制包含掩码的多头注意力…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…

libvirt 热迁移流程及参数介绍

01 热迁移基本原理 1.1 热迁移概念 热迁移也叫在线迁移&#xff0c;是指虚拟机在开机状态下&#xff0c;且不影响虚拟机内部业务正常运行的情况下&#xff0c;从一台宿主机迁移到另外一台宿主机上的过程。 1.2 虚拟机数据传输预拷贝和后拷贝 预拷贝(pre-copy)&#xff1a; …

Windows如何恢复已删除的Word文档?

案例&#xff1a;可以恢复已删除的Word文档吗&#xff1f; “大家好&#xff0c;我遇到了一个问题&#xff0c;需要大家的帮助。昨天我编辑了一个Word文档并保存到了桌面上&#xff0c;但当我今天再次打开电脑时&#xff0c;它就不见了&#xff01;昨天工作完成后&#xff…

Sentinel 规则详解

Sentinel 规则 流控规则 flow1、QPS流控2、并发线程数流控3、流控模式4、流控效果 熔断&#xff08;降级&#xff09;规则 degrade1、慢调用比例2、异常比例3、异常数 热点规则 param-flow授权规则 authority1、应用场景2、自定义来源3、授权规则配置 系统规则 前言&#xff1a…

JMeter进行WebSocket压力测试

背景 之前两篇内容介绍了一下 WebSocket 和 SocketIO 的基础内容。之后用 Netty-SocketIO 开发了一个简单的服务端&#xff0c;支持服务端主动向客户端发送消息&#xff0c;同时也支持客户端请求&#xff0c;服务端响应方式。本文主要想了解一下服务端的性能怎么样&#xff0c;…

4.6.tensorRT基础(1)-实际模型上onnx文件的各种操作

目录 前言1. onnx1.1 读取节点1.2 修改节点1.3 替换节点1.4 删除节点1.5 修改input和output1.6 预处理的接入 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#…

【深度学习】神经网络初学者指南

一、说明 这是一篇对神经网络的泛泛而谈的文章&#xff0c;我的意见是&#xff0c;先知道框架&#xff0c;而后知道每一个细节&#xff0c;这是学习人工智能的基本路线。本文就神经网络而言&#xff0c;谈到一些基础概念&#xff0c;适应于初学者建立概念。 二、神经网络定义 神…