【网络通信】TCP网络编程

2023-11-20

一、面向连接的TCP流模式

在这里插入图片描述

二、server程序

#include <sys/types.h> 
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>

/* socket
 * bind
 * listen
 * accept
 * send/recv
 */

#define SERVER_PORT 8888  // Server端口
#define BACKLOG 	10    // listen请求排队的最大长度

int main(int argc, char **argv)
{
	int iSocketServer;
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;
	int iRet;
	int iAddrLen;
	int iRecvLen;
	int iClientNum = -1;
	unsigned char ucRecvBuf[1000];

	signal(SIGCHLD,SIG_IGN);  // 避免僵死子进程
	
	/* 1.创建Server端套接字,AF_INET表明地址族 IPv4 Internet,SOCK_DGRAM表明使用 UDP 协议,返回文件描述符。 */
	iSocketServer = socket(AF_INET, SOCK_STREAM, 0);
	if(-1 == iSocketServer)
	{
		printf("socket error!\n");
		return -1;
	}

	tSocketServerAddr.sin_family = AF_INET;           // 地址族 IPv4 Internet
	tSocketServerAddr.sin_port = htons(SERVER_PORT);  // 主机字节序转换为网络字节序 host to net, short
	tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;   // 所有地址 0.0.0.0
	memset(tSocketServerAddr.sin_zero, 0, 8);         // 清零,不使用
	
	/* 2.通过文件描述符绑定Server端套接字的IP地址和端口。 */
	iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
	{

		if(-1 == iRet)
		{
			printf("bind error!\n");
			return -1;
		}
	}

	/* 3.创建监听队列,并将 bind 的文件描述符变为监听套接字。 */
	iRet = listen(iSocketServer, BACKLOG);
	if(-1 == iRet)
	{
		printf("listen error!\n");
		return -1;
	}

	while(1)
	{
		iAddrLen = sizeof(struct sockaddr);
		
		/* 4.获得连接请求,并且建立连接。每处理一个连接,则 accept 返回该连接对应的套接字描述符。如果该队列为空,则 accept 阻塞。 */
		iSocketClient = accept(iSocketServer, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
		if(-1 != iSocketClient)
		{
			// inet_ntoa 将网络地址转换成“.”点隔的字符串格式
			printf("Get Connect From Client %d : %s\n", ++iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));
			
			if(!fork())  // 创建子进程
			{
				while(1)

				{
					/* 5.recv接收 TCP 连接的对端发送来的数据,返回值是实际读到的字节数。 */
					iRecvLen = recv(iSocketClient, ucRecvBuf, 999, 0);
					if(iRecvLen <= 0)
					{
						close(iSocketClient);
						return -1;
					}
					else
					{
						// 数组结尾加'\0'转换为字符数组
						ucRecvBuf[iRecvLen] = '\0';
						printf("Get Msg From Client %d : %s\n", iClientNum, ucRecvBuf);
					}
				}
			}
		}
	}

	close(iSocketServer);
	return 0;
}

三、client程序

#include <sys/types.h> 
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

/* socket
 * connect
 * send/recv
 */

#define SERVER_PORT 8888  //Server端口

int main(int argc, char **argv)
{
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	int iRet;
	unsigned char ucSendBuf[1000];
	int iSendLen;

	if(argc != 2)
	{
		printf("Usage: %s <server_ip>\n", argv[0]);
		return -1;
	}
	
	/* 1.创建Client端套接字,AF_INET表明地址族 IPv4 Internet,SOCK_STREAM表明使用 TCP 协议,返回文件描述符。 */
	iSocketClient = socket(AF_INET, SOCK_STREAM, 0);

	tSocketServerAddr.sin_family = AF_INET;           // 地址族 IPv4 Internet
	tSocketServerAddr.sin_port = htons(SERVER_PORT);  // 主机字节序转换为网络字节序 host to net, short
 	//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY; // 所有地址 0.0.0.0
 	if (0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr))
 	{
		printf("invalid server_ip!\n");
		return -1;
	}
	memset(tSocketServerAddr.sin_zero, 0, 8);         // 清零,不使用

	/* 2.connect一般由客户端程序执行,需要指定连接的服务器端的 IP 地址和端口。该方法执行后,会进行三次握手,建立连接。 */
	iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
	if(-1 == iRet)
	{
		printf("connect error!\n");
		return -1;
	}

	while(1)
	{
		if(fgets(ucSendBuf, 999, stdin))
		{
			/* 3.send用来向 TCP/UDP 连接的对端发送数据。 */
			iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);
			if(iSendLen <= 0)
			{
				close(iSocketClient);
				return -1;
			}
		}
	}
	
	return 0;
}

四、相关文章

1.TCP网络编程

2.sockaddr和sockaddr_in详解

3.socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

4.详解linux中的backlog

5.Linux中fork()函数详解

6.memset的用法详解

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

【网络通信】TCP网络编程 的相关文章

  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 自动打开命名管道和 tcp\ip

    我正在安装一个需要修改 SQL Server 的新产品 具体来说 启用 tcp ip 并打开命名管道 我知道如何手动完成 我想要的是一种通过 SQL 或 C 代码为新客户自动化执行此操作的方法 我希望有任何关于正确方向的建议 您可以使用 C
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 触发“对等方重置连接”

    我想测试当发生 对等方重置连接 错误时我们的应用程序 嵌入式 ftp 服务器 中发生的日志记录 这个帖子 https stackoverflow com questions 1434451 connection reset by peer很
  • 序列化是通过套接字发送数据的最佳选择吗?

    有人告诉我 序列化不是通过套接字发送数据的最佳方法 但他们说他们在一本书上读过一次 并且不确定更好的方法 因为他们以前没有真正做过网络 那么序列化是最好的方法还是有更好的方法 如果这有很大的不同的话 这也是一个游戏 通过搜索有关通过它发送对
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • 如何知道哪个本地应用程序连接到我的套接字(Windows)

    我有一个绑定到某个 TCP 端口的 Windows 服务 该端口用于我的应用程序之间的 IPC 有没有一种编程 WinAPI WinSocket 等 方法可以知道哪个应用程序连接到我的端口 即在我的 Windows 服务中 我想获取连接到我
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • PHP 通过 TCP/IP 发送消息

    我尝试通过 TCP IP 从 PHP 网站向 Arduino 发送消息 使用以下代码我可以从 php 网站发送消息 问题是 当第一次调用该网站时 消息不会立即发送 网站刷新几次后 消息就会到达 但逻辑上很多次 就像网站刷新量一样 已经尝试将
  • 我首次设置 AWS EB 时创建的默认安全组是什么?

    我对几个组所扮演的角色感到困惑 这些组似乎已自动添加到我的 AWS 安全组列表中 并以我收集的默认配置进行连接 并且想知道它们是如何工作的 以及它们的安全性如何 改变 具体来说 有三个神秘之处 launch wizard 1其中有一条入站规
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • 伪TCP通道

    什么是伪 TCP 通道以及如何实现 伪 TCP 是一种协议 它实现了 TCP 的一些思想 通过不可靠的基于数据包的接口提供可靠的数据流 例如 如果您只能访问 UDP 但想要 一种可靠的方式来传递数据 则可以使用此方法 您可以在这里找到示例代
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL

随机推荐

  • VS2017+WDK10驱动编译与调试

    驱动编译 安装VS2017 和WDK 10 下载地址 https docs microsoft com zh cn windows hardware drivers download the wdk 如果安装VS2017时没有选择安装win
  • 三面美团被问:MySQL的B+Tree索引到底是咋回事?聚簇索引到底是如何长高的?这不是必过?

    你肯定知道MySQL进行CRUD是在内存中进行的 也就是在Buffer Pool中 然后你也知道了当内存中没有MySQL需要的数据时 MySQL会从Disk中通过IO操作将数据读入内存中 读取的单位呢就是 数据页 一般数据页长下面这样 没错
  • 17.清晰架构(01): 融合 DDD、洋葱架构、整洁架构、CQRS...(译)

    17 清晰架构 01 融合 DDD 洋葱架构 整洁架构 CQRS 译 原文 https herbertograca com 2017 11 16 explicit architecture 01 ddd hexagonal onion cl
  • 作物产量常用的单位换算公式

    作物产量常用的单位换算公式 一 产量的定义 Agronomic Yields 1 Abstrct 2 Protocol 2 1 Grain Harvest of Annual Row crops 标准含水量 For corn the sta
  • Python人工智能,13天快速入门机器学习教程,含14大案例(NBA球员数据分析,北京租房数据,疾病数据预测等)

    40h小时入门人工智能 带你了解人工智能的前世今生 带你掌握人工智能经典算法 可掌握核心能力 1 掌握机器学习中处理数据的方法 2 理解经典的机器学习算法原理 3 掌握机器学习中工作的具体流程 Python人工智能13天快速入门机器学习教程
  • Android studio Mac快捷键连续选择相同内容和选中当前光标位置内容

    刚从Windows换到Mac第一件事绝对是先熟悉AS的快捷键 有两个很好用的快捷键找了很久都没找到 这里放出来 连续选择相同内容 Windows Alt j Control G Mac接Windows键盘是 Ctrl G 效果如下 选中当前
  • 面试之MySQL调优问题

    文章目录 前言 一 MySQL的底层原理粗解 1 1 MySQL的底层运作 1 2 MySQL的存储方式 二 索引 重点内容 2 1 索引是什么 2 2 MySQL调优到底是调啥的 2 3 如何创建一个索引 2 3 1在创建表的时候创建索引
  • Linux 上传删除文件命令

    rm 文件名 删除 rz Enter 上传文件 Ctrl z 退出
  • 枚举基础问题

    枚举问题 与7无关的数为例 枚举问题 这类问题并不复杂 对于题目本身只需要通过循环去遍历 列举出所有可能满足条件的情况 一个一个罗列出来 称为枚举问题 例如下面的题目 与7无关的数 这就是一类枚举问题 将所有可能满足 与7无关的数 罗列出来
  • POC - Adobe ColdFusion 反序列化漏洞(CVE-2017-3066)

    安装010Editer 下载链接 http www pc6 com softview SoftView 55129 html 复制POC的十六进制 00 03 00 00 00 01 00 00 00 00 00 00 00 01 11 0
  • html制作简单的表单<form>

    文章目录 一 使用到的标签用法介绍 1 演示标签代码 2 标签使用具体介绍 二 表单制作代码 三 结果显示 一 使用到的标签用法介绍 1 演示标签代码
  • 输出九九乘法表

    九九乘法表 尝试编写程序 输出九九乘法表 具体如下图所示 代码 include
  • redis服务器信息统计,Redis 返回关于 Redis 服务器的各种信息和统计数值 命令:INFO...

    INFO section 以一种易于解释 parse 且易于阅读的格式 返回关于 Redis 服务器的各种信息和统计数值 通过给定可选的参数 section 可以让命令只返回某一部分的信息 server 一般 Redis 服务器信息 包含以
  • 突发!ITELLYOU要改版了!

    微信公众号 网管小贾 个人博客 www sysadm cc 经常下载Windows系统镜像的老司机中 我敢保证十之八九对 MSDN 我告诉你 这个网站再熟悉不过 可是对于新手小白们来说 这个站TA究竟是个啥 其实 MSDN 我告诉你 是个名
  • 解决火狐首次启动太慢的方法

    众所周知 火狐浏览器有一定的优越性 现在众多的网站都采用了jquery技术 而ie在加载jquery上效果实在太差 尤其是配置稍低的情况下 ie很容易被卡死 这就体现出了火狐的优势 但火狐唯一不足的就是第一次启动的速度非常的慢 下面就是解决
  • 世界芯中国芯RISC-V相关资源及进展

    目录 1 RISC V介绍 RISC V为何会在最近两年迅速崛起 RISC V处理器生态 RISC V商业模式 2 RISC V发展历程 3 RISC V国际协会 4 中国RISC V产业联盟 5 RISC V相关资源 1 指令集规范 2
  • kotlin 之于 java 的差异

    一 变量声名 赋值和访问 kotlin 变量是空安全的 一般要求声明时就赋值 声名变量有两个关键字var和val 其中val相当于 java 的中的final 变量类型可显式给出 也可隐式推断 变量也可分可空类型和非空类型 以下给出几种声名
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • Altium Designer 20 常见错误

    记录学习过程中出现的错误及解决方法 1 off grid pin问题和Off grid Net Label问题 Off grid Net Label问题解决 只需要选中出现警告的元件 然后按A再按G即可 或者按Shift Ctrl D也行
  • 【网络通信】TCP网络编程

    TCP网络编程 一 面向连接的TCP流模式 二 server程序 三 client程序 四 相关文章 1 TCP网络编程 2 sockaddr和sockaddr in详解 3 socket编程为什么需要htons ntohl ntohs h