TCP/IP网络编程(一)

2023-10-26

TCP/IP网络编程

第一章 理解网络编程和套接字

实现

  1. 先准备一个linux的操作系统然后用xshell连上

CentOS7安装以及Xshell连接常见问题解决_jump_into_zehe的博客-CSDN博客

  1. 下载gcc
[root@localhost tcp]# which gcc
/usr/bin/which: no gcc in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/hongzehe/.local/bin:/home/hongzehe/bin)
[root@localhost tcp]# yum -y install gcc automake autoconf libtool make
  1. 创建服务器端C文件
mkdir tcpip
cd tcpip

​ 创建hello_server.c并将下面的代码拷贝进去

vi 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; //服务器socket,其实就是一个文件描述符fd
	int clnt_sock; //客户端socket
	
	struct sockaddr_in serv_addr; //服务器ip port
	struct sockaddr_in clnt_addr; //客户端ip port
	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); //获得服务器socket
	if(serv_sock == -1)
		error_handling("socket() error");
	memset(&serv_addr,0,sizeof(serv_addr)); //初始化为0
	serv_addr.sin_family=AF_INET; //ip版本
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); //ip地址
	serv_addr.sin_port=htons(atoi(argv[1])); //端口
	
	if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1) //对socket绑定ip地址和端口号
		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); //获取外来连接的客户端socket
	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);
}

编译该文件

gcc hello_server.c -o hello_server

编译完之后会生成hello_server可执行文件,执行该程序

./hello_server 9190  #在端口9190处监听
  1. 创建客户端程序
vi 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); //获取客户端socket
	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]); //设置服务器ip地址
	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);
}

编译文件

gcc hello_client.c -o hello_client

在xshell复制一个会话开启一个新的终端然后执行该文件,第一个终端在等待连接,没有收到连接程序会一直运行

./hello_client 127.0.0.1 9190

这时候我们就会收到来自服务器端的响应啦!

[root@localhost tcp]# ./hello_client 127.0.0.1 9190
Message from server : Hello World!!! 

原理

在linux中,socket和文件是没有区别的,linux中,一切皆文件,服务器和客户端之间的数据传输在linux中其实就是一个写文件的过程,而socket是用来连接网络的工具,所以我们使用socket编程时是不需要去关心我们的数据到底是如何从一台电脑传输到另一台的,socket已经帮我们实现了,我们要做的就是编写服务器和客户端的程序

参考

《TCP/IP网络编程》 【韩】 尹圣雨 著 金国哲 译

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP/IP网络编程(一) 的相关文章

  • 如果等于特定值则替换列

    我希望替换 CSV 中的第四列 如果它等于 N A 我正在尝试将其更改为 1 我似乎无法让它发挥作用 awk F if 4 N A 4 1 test csv 您可以使用以下内容awk awk F 4 4 N A 1 4 1 OFS test
  • python os.path.exists() 对于存在的 nfs 挂载目录文件失败

    我基本上有一个用于网站的网络服务器和另一个仅存储文件的网络服务器 文件服务器通过安装其目录之一连接到主服务器 该网站运行 Django 所以我主要处理 python 不管怎样 我似乎遇到了一些问题 文件被报告为不存在 即使它们实际上存在 基
  • 字符串常量之前的预期标识符

    有一个这样的程序 include
  • 在linux中将数据“广播”到多个进程的规范方法?

    我有一个应用程序需要将数据流从一个进程发送到多个读取器 每个读取器都需要查看自己的流副本 这是相当高的速率 100MB s 并不罕见 因此我希望尽可能避免重复 在我的理想世界中 Linux 应该有支持多个读取器的命名管道 并为常见的单读取器
  • gai_cancel() 需要很长时间才能成功

    我正在尝试在 C 中异步查找域 原因是我希望能够有效地添加超时期限 以防系统无法查找域 我遇到了 getaddrinfo a 命令 所以我决定尝试一下 然而 在我的机器上取消任何不会成功的 dns 查找 例如没有互联网连接时 永远不会花费少
  • 如何使用Python distutils?

    我用 python 编写了一个快速程序 将 gtk GUI 添加到 cli 程序中 我想知道如何使用 distutils 创建安装程序 因为它只是命令行应用程序的 GUI 前端 所以它只能在 nix 中工作 所以我不担心它是跨平台的 我的主
  • 为什么不使用 sshrc 中设置的 $PATH?

    我正在尝试在 OS X 服务器上通过 ssh 设置 svn 为了做到这一点 我读到我需要一个包装器来设置 umask 并 在我的例子中 设置存储库根 一种快速而肮脏的方法是重命名 usr bin svnserve并将包装器脚本放置在该位置
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • 我应该如何从非 root Debian Linux 守护进程登录?

    我正在编写一个新的守护进程 它将托管在 Debian Linux 上 我发现 var log 具有仅 root 写入权限 因此我的守护进程无法在那里写入日志文件 但是 如果它写入那里 它似乎将获得自动日志轮转 并且也按照用户期望的方式工作
  • SDL/C++ OpenGL 程序,如何阻止 SDL 捕获 SIGINT

    我在用SDL http www libsdl org 用于在 Linux 上运行的 OpenGL 应用程序 我的问题是 SDL 正在捕获 SIGINT 并忽略它 这是一个痛苦 因为我正在通过屏幕会话进行开发 并且我无法使用 CTRL C 终
  • 如何在多行而不是单行输出上打印 Linux 组名称

    我尝试过 getent group 命令 id Gn user 和一些 sed 组合 但我认为我无法实现 因此向其他程序员伸出援手 我希望能够打印此 groups abc123输出 abc123 devops 构建测试设计 预期输出 gro
  • 使用 Python for Linux 模拟按键事件

    我正在编写一个脚本来自动运行特定模型 当模型失败时 它会等待用户输入 Enter 键 我可以检测到模型何时失败 但我无法使用 python 在 Linux 上 来模拟按键事件 Windows 有 SendKeys 库来执行此操作 但我想知道
  • 共享库 RPATH 和二进制 RPATH 优先级

    如果共享库链接到二进制文件 并且共享库还依赖于其他库 则共享库的 RPATH 和二进制文件的 RPATH 的优先级 链接器搜索顺序 是什么 二进制文件的 RPATH 是否可以覆盖共享库中的 RPATH 我在共享库RPATH中设置的 ORIG
  • 如何安装 Node 和 NPM 以便不必使用 sudo?

    我正在尝试在 Ubuntu 14 04 计算机上设置 Node js 和 NPM 但遇到了一些问题 在我的第一次尝试中 我不断得到EACCES尝试安装软件包时出错 有时甚至使用sudo 所以我彻底卸载了node和npm 现在我正在尝试找出如
  • 在 RPM 规范文件中使用 Jenkins BUILD NUMBER

    Name My Software Version 1 0 5 Release 1 Summary This is my software 不确定是否有人以前尝试过这个或者它是否容易 但是 规范文件的版本有两个独特的指示符 版本 指定软件版本
  • 如何删除警告:link.res包含输出部分;你忘了-T吗?

    我正在使用 fpc 编译器 我想删除此警告 我已经阅读了 fpc 的选项 但我找不到如何做到这一点 这可能吗 当我运行命令时出现 fpc foo pas out 目标操作系统 Linux for i386 编译 foo pas 链接 p2
  • 将 React 应用程序作为后台进程运行

    我对部署前端代码完全陌生 因此提出了这个问题 我有一个 React 应用程序 需要作为后台进程运行 但是我对如何执行此操作有点困惑 我运行一个 npm 脚本 npm run build 在服务器上构建 缩小和服务项目 构建过程的相关代码是这
  • 为什么每次运行应用程序时都必须使用导出来定义 LD_LIBRARY_PATH?

    我有一些使用一些共享库的代码 gcc 上的 c 代码 编译时 我必须使用 I 和 L 显式定义包含目录和库目录 因为它们不在标准位置 当我尝试运行代码时 出现以下错误 sync test sync test error while load
  • Linux 上的 JavaFX

    Linux x86 和 x64 上的 JavaFX 情况如何 JavaFX 应用程序可以在 Linux 操作系统上顺利执行吗 我发现了 2011 年和 2012 年的一些问题 当时应用程序不稳定 目前发布的 JFX 版本是 2 2 4 在
  • cURL 错误 28:5001 毫秒后解析超时

    我使用 WordPress 最近将我的网站从 cpanel 主机移动到带有 directadmin 面板的 Linux 服务器 转账后立即发现客户在通过EDD插件下载时出现以下错误 cURL 错误 28 5001 毫秒后解析超时 我也遇到了

随机推荐

  • JavaScript 的面向对象基础,设计模式中的原型模式(设计模式与开发实践 P2)

    文章目录 1 1 动态类型语言和鸭子类型 1 2 多态 1 3 封装 封装数据 封装实现 封装类型 1 4 原型模式和基于原型继承的 JavaScript 对象系统 C 原型模式 JS 原型模式 在学习 JS 设计模式之前需要了解一些设计模
  • 嵌入式开发课程简介

    最近几年 几乎所有的IT企业对应届毕业生都有抱怨 动手能力太差 编程水平低下 大学期间 老师授课以理论为主 学生缺少各种实践 这造成很多学生就业难 学生找不到工作 而企业招不到合适的人 本课程不仅系统的梳理了一遍工作中常用的知识 更是通过大
  • LLM论文周报|来自清华、MetaAI、Nous Research等机构论文研究

    大模型 LLM 是一种人工智能模型 旨在理解和生成人类语言 它们在大量的文本数据上进行训练 可以执行广泛的任务 包括文本总结 翻译 情感分析等等 LLM的特点是规模庞大 包含数十亿的参数 帮助它们学习语言数据中的复杂模式 这些模型通常基于深
  • 安装搭建悟空CRM 网络错误,请检查您的网络 问题处理

    1 很多朋友在GitHub上面下载的悟空crm最新版程序 进行安装搭建后发现 运行程序打开显示 悟空软件 但是登录进去管理界面的时候就提示说 网络请求失败 请稍候再试 怎么办呢 2 导入服务端根文件夹数据库文件public sql 5kcr
  • Kubernetes 网络概念及策略控制(叶磊)

    本文将主要分享以下 5 方面的内容 Kubernetes 基本网络模型 Netns 探秘 主流网络方案简介 Network Policy 的用处 思考时间 Kubernetes 基本网络模型 本节来介绍一下 Kubernetes 对网络模型
  • SpringBoot 集成MyBatis-Plus提示反序列化异常:cannot deserialize from Object value (no delegate- or property-bas

    SpringBoot集成MyBatis Plus 实现HTPP POST提交实体对象提示如下错误片段 重点错误信息字段 cannot deserialize from Object value no delegate or property
  • ECharts折线图+联动+dataZoom

  • SpringBoot配置数据源DataSource

    使用properties文件配置springboot默认数据源 这种方式十分简单 只用在application properties文件中配置数据库连接属性即可 spring datasource url jdbc mysql localh
  • 7-22 龟兔赛跑 (20分)

    思路 当时间为10的倍数的时候看看兔子的路程有没有乌龟的长 若比乌龟长 则兔子开始休息三十分钟 其中有一个测试点就是注意兔子在休息中时间t到了 代码如下 include
  • ERROR: Invalid requirement: ‘_libgcc_mutex=0.1=main‘ XXX Hint: = is not a valid operator. Did you me

    问题如图所示 我是在GitHub加载environment yml文件时 遭遇这种情况 其实 这也不难解决 其一将environment yml文件中dependencices中 报错的部分依赖项 放到 pip 下 或者将 libgcc m
  • 探索将大语言模型用作推荐系统

    编者按 目前大语言模型主要问答 对话等场景 进行被动回答 是否可以将大模型应用于推荐系统 进行主动推送呢 这篇文章回顾了可以将大模型作为推荐系统的理论基础 并重点描述了基于英文和阿拉伯语的购物数据集微调T5 large模型 探索将LLMs用
  • d3dcompiler_43.dll文件丢失怎么修复,最新修复方法分享

    本教程操作系统 Windows系统 d3dcompiler 43 dll是电脑文件中的dll文件 动态链接库文件 如果计算机中丢失了某个dll文件 可能会导致某些软件和游戏等程序无法正常启动运行 并且导致电脑系统弹窗报错 在我们打开软件或者
  • PyTorch Lightning错误TypeError: lr_scheduler_step() takes 3 positional arguments but 4 were given

    问题 使用PyTorch Lightning时对lr scheduler step定义如下 def lr scheduler step self scheduler metric scheduler step 出错 TypeError lr
  • Ubuntu 安装 cmake

    目录 1 下载cmake安装包 2 开始安装 3 查看cmake版本 参考链接 https blog csdn net qq 27350133 article details 121994229 1 下载cmake安装包 cmake安装包下
  • Jmeter实现websocket协议接口测试

    一 为了方便使用 首先将jmeter设置成中文 有两种方法 1 在Jmeter界面进行设置 Options gt Choose Language gt Chinese Simplified 这种方法在关闭jmeter重启后又会恢复成默认的英
  • 最优化理论·非线性最小二乘

    最优化理论 非线性最小二乘 标签 空格分隔 数学 非线性最小二乘问题是椭圆拟合中最易遇到的优化问题 本文主要对非线性二乘的基本分析做简单介绍 1 什么是最小二乘问题 目标函数能够写为m个函数平方和的优化问题 其中 每个函数 f i x
  • 高内聚、低耦合

    http www cnblogs com robnetcn archive 2012 04 15 2449008 html 起因 模块独立性指每个模块只完成系统要求的独立子功能 并且与其他模块的联系最少且接口简单 两个定性的度量标准 耦合性
  • crunch 字典生成 hashcat 破解密码

    crunch crunch 9 9 t 2003 gt gt 999 txt 生成9位密码 b 指定文件输出的大小 避免字典文件过大 c 指定文件输出的行数 即包含密码的个数 d 限制相同元素出现的次数 e 定义停止字符 即到该字符串就停止
  • 配置Tomcat数据源和连接池

    修改C Tomcat 6 0 conf context xml 在
  • TCP/IP网络编程(一)

    TCP IP网络编程 第一章 理解网络编程和套接字 实现 先准备一个linux的操作系统然后用xshell连上 CentOS7安装以及Xshell连接常见问题解决 jump into zehe的博客 CSDN博客 下载gcc root lo