TCP/IP网络编程(一) 理解网络编程和套接字
文章目录
- 理解网络编程和套接字
- 网络编程和套接字概要
- 构建套接字
- 编写 Hello World 服务器端
- 构建请求连接套接字
- 在Linux平台下运行
- 基于Linux的文件操作
- 打开文件
- 关闭文件
- 将数据写入文件
- 读取文件中的数据
理解网络编程和套接字
网络编程和套接字概要
网络编程就是编写程序使两台联网的计算机相互交换数据
为了与远程计算机进行数据传输,需要连接因特网,而编程种的套接字就是用来连接该网络的工具。
构建套接字
1.调用soecket函数创建套接字
#include<sys/socket.h>
int socket(int domain, int type, int protocol);——>成功返回文件描述符,失败返回-1
2.调用bind函数给套接字分配地址
#include<sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);——>成功返回0,失败返回-1
3.调用listen函数将套接字转化为可接受连接的状态
#include<sys/socket.h>
int listen(int sockfd, int backlog);——>成功时返回0,失败返回-1
4.调用accept函数接受连接请求
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);——>成功时返回文件描述符,失败返回-1
网络编程中接受连接请求的套接字创建过程总结如下:
1.调用soecket函数创建套接字
2.调用bind函数给套接字分配地址
3.调用listen函数将套接字转化为可接受连接的状态
4.调用accept函数接受连接请求
编写 Hello World 服务器端
服务器端(server)是能受理连接请求的程序
hello_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>void error_handling(char *message);int main(int argc, char *argv[])
{int serv_sock;int clnt_sock;struct sockaddr_in serv_addr;struct sockaddr_in clnt_addr;socklen_t clnt_addr_size;char message[]="Hello World!";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("socket() 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_addr_size=sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);if(clnt_sock==-1)error_handling("accept() error"); write(clnt_sock, message, sizeof(message));close(clnt_sock); close(serv_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
构建请求连接套接字
客户端程序只有调用socket函数创建套接字和调用connect函数向服务器发出连接请求两个步骤
hello_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>void error_handling(char *message);int main(int argc, char* argv[])
{int sock;struct sockaddr_in serv_addr;char message[30];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!");str_len=read(sock, message, sizeof(message)-1);if(str_len==-1)error_handling("read() error!");printf("Message from server: %s \n", message); close(sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
请求连接函数
#include<sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr, socklen_t addrlen);——>成功返回0,失败返回-1
在Linux平台下运行
gcc hello_server.c -o hserver
./hserver 9190
现在已经打开了服务端,但是调用的accept函数还没有返回,接下来运行客服端
gcc hello_client.c -o hclient
./hclient 192.168.233.20 9190
输出: Hello World!
基于Linux的文件操作
打开文件
#include <sys/type.h>
#include <sys/stat.h>
#include <fcnt.h>int open(const char *path, int flag);——>成功返回文件描述符,失败返回-1path 文件名的字符串地址flag 文件打开模式信息
文件打开模式
打开模式 含义
O_CREAT 必要时创建文件
O_TRUNC 删除全部现有数据
O_APPEND 维持现有数据,保存末尾
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
关闭文件
#include<unistd.h>int close(int fd);——>成功返回0,失败返回-1
将数据写入文件
#include<unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);——>成功时返回写入的字节数,失败返回-1buf保存要传输数据的缓冲地址nbytes要传输的字节数
函数定义中,size_t是通过typedef声明的unsigned int类型,对于ssize_t来说s代表signed,ssize_t为signed int类型
lower_open.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>void error_handling(char* message);int main(void)
{int fd;char buf[]="Let's go!\n";fd=open("data.txt", O_CREAT|O_WRONLY|O_TRUNC);if(fd==-1)error_handling("open() error!");printf("file descriptor: %d \n", fd);if(write(fd, buf, sizeof(buf))==-1)error_handling("write() error!");close(fd);return 0;
}void error_handling(char* message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
读取文件中的数据
与write函数对应,read函数是用来接受数据的
#include<unistd.h>ssize_t read(int fd, void *buf, size_t nbytes)——>成功返回接受的字节数,失败返回-1
lower_read.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>#define BUF_SIZE 100void error_handling(char* message);int main(void)
{int fd;char buf[BUF_SIZE];fd=open("data.txt", O_RDONLY);if( fd==-1)error_handling("open() error!");printf("file descriptor: %d \n" , fd);if(read(fd, buf, sizeof(buf))==-1)error_handling("read() error!");printf("file data: %s", buf);close(fd);return 0;
}void error_handling(char* message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}
ps:
在文中出现好多次void error_handling(char* message)函数,这个是打印错误信息的,也可以用perror函数,例如
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open(data.txt, O_RDONLY);if(fd == -1){perror("open:");}
}
更多资料点击 GitHub 欢迎各位读者去Star
⭐学术交流群Q 754410389 持续更新中~~~
相关文章:
TCP/IP网络编程(一) 理解网络编程和套接字
文章目录 理解网络编程和套接字网络编程和套接字概要构建套接字编写 Hello World 服务器端构建请求连接套接字在Linux平台下运行 基于Linux的文件操作打开文件关闭文件将数据写入文件读取文件中的数据 理解网络编程和套接字 网络编程和套接字概要 网络编程就是编写程序使两台…...
Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。标题取自其中三则分享,不代表全部内容都是该主题,特此声明。 本周刊由 Python猫 出品,精心筛选国内外的 250 信息源,为你挑选…...
装备一台ubuntu
配置远程连接: ubuntu的root用户无法远程登入问题: openssh安装命令: sudo apt-get install openssh-server 安装完成通过以下命令查看SSH是否启动 ps -e | grep ssh 如果只有ssh-agent表示还没启动,需要: /etc/i…...
为了更好和大家交流,欢迎大家加我的微信账户
因为一些懂的都懂的原因,如果我的账户显示为 此时我无法通过站内信、留言或者任何方式和大家联系。 如果看到这样的内容,可以在此评论区留下你的微信账户,我看到后会添加你。为防止其他人冒充我,我的微信号以2206结尾。...
MS1826A HDMI 多功能视频处理器 HDMI4进1出画面分割芯片
基本介绍 MS1826A 是一款多功能视频处理器,包含 4 路独立 HDMI 音视频输入通道、1 路 HDMI 音视 频输出通道以及 1 路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字库定 制型 OSD;可处理隔行和逐行视频或者图形输入信号࿱…...
最新文献怎么找|学术最新前沿文献哪里找
查找下载最新文献最好、最快、最省事的方法就是去收录该文献的官方数据库中下载。举例说明: 有位同学求助下载一篇2023年新文献,只有DOI号10.1038/s41586-023-06281-4,遇到这种情况可以在DOI号前加上http://doi.org/输入地址栏查询该文献的篇…...
ctfshow 红包题
前言: 最近一直在搞java很少刷题,看见ctfshow的活动赶紧来复现一波~ ctfshow 红包挑战7 <?php highlight_file(__FILE__); error_reporting(2); extract($_GET); ini_set($name,$value); system("ls ".filter($_GET[1])."" )…...
SpringBoot项目(jar)部署,启动脚本
需求 SpringBoot项目(jar)部署,需要先关闭原来启动的项目,再启动新的项目。直接输入命令,费时费力,还容易出错。所以,使用脚本启动。 脚本 脚本名:start.sh 此脚本需要放置在jar包…...
大数据(四)主流大数据技术
大数据(四)主流大数据技术 一、写在前面的话 To 那些被折磨打击的好女孩(好男孩): 有些事情我们无法选择,也无法逃避伤害。 但请你在任何时候都记住: 你可能在一些人面前,一文不值&a…...
【已解决】激活虚拟环境报错:此时不应有Anaconda3\envs\[envs]\Library\ssl\cacert.pem。
新建虚拟环境后,进入虚拟环境的时候出现这样的报错: 此时不应有Anaconda3 envs yolov5 Library ssl cacert.pem。 但是之前装的虚拟环境也还能再次激活,base环境也无任何问题,仅新装的虚拟环境无法激活。 查遍了百度谷歌ÿ…...
Vue安装过程的困惑解答——nodejs和vue关系、webpack、vue-cli、vue的项目结构
文章目录 1、为什么在使用vue前要下载nodejs?2、为什么安装nodejs后就能使用NPM包管理工具?3、为什么是V8引擎并且使用C实现?4、为什么会安装淘宝镜像?5、什么是webpack模板?6、什么是脚手架 vue-cli?6.1 安…...
PWA ~
vite 安装: pnpm i vite-plugin-pwa -Dvite.config import { VitePWA } from vite-plugin-pwa export default defineConfig({plugins: [VitePWA()] })env.d.ts /// <reference types"vite-plugin-pwa/client" />打包构建:registerSW…...
YII项目在Docker中运行缓慢
缓慢问题分析 请求YII的api时间请求原生查询时间win10 上运行docker上的php api异常慢ubuntu 中拉代码git报错 请求YII的api时间 请求原生查询时间 win10 上运行docker上的php api异常慢 链接阿里数据的 入口直接返回的 网上有说是docker的dns解析慢; 也有说是…...
合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)
图表 (Chart) 一幅图胜过一千个字,通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, …...
Three.js之模型对象、材质
参考资料 三维向量Vector3与模型位置…克隆.clone()和复制.copy() 知识点 注:基于Three.jsv0.155.0 三维向量Vector3与模型位置欧拉Euler与角度属性.rotation模型材质颜色(Color对象)模型材质父类Material:透明、面属性模型材质和几何体属性克隆.clo…...
uniapp启动微信小程序开发者工具报错Enable IDE Service (y/N) [27D[27C
下载安装好微信小程序开发者路径 配置好启动路径后 报错[微信小程序开发者工具] ? Enable IDE Service (y/N) [27D[27C 解决办法 因为微信开发者工具的服务端口号没有打开...
Gitee注册和使用
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.Gitee 1.1Gitee是什么 1.2Gitee的注册以及远程仓库的创建…...
【Flutter】下载安装Flutter并使用学习dart语言
前言 安装flutter, 并使用flutter内置的dartSDK学习使用dart语言。 编辑器: Android Studio fluuter 版本 : flutter_windows_3.13.1 内置dartSDK : 3.1.0 dart路径路径: flutter安装路径\bin\cache\dart-sdk 安装Flutter 下载安装包 flutter下载地址…...
HTTP返回状态值详解整理
一、总体 1xx:信息响应类,表示接收到请求并且继续处理 2xx:处理成功响应类,表示动作被成功接收、理解和接受 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理 4xx:客户端错误,客户请求包含语法错误或者是不能…...
python web 开发与 Node.js + Express 创建web服务器入门
目录 1. Node.js Express 框架简介 2 Node.js Express 和 Python 创建web服务器的对比 3 使用 Node.js Express 创建web服务器示例 3.1 Node.js Express 下载安装 3.2 使用Node.js Express 创建 web服务器流程 1. Node.js Express 框架简介 Node.js Express 是一种…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
