linux 下TCP通信例程

2023-05-16

TCP server

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/if.h>
#include <sys/ioctl.h>

#include <unistd.h>
#include <signal.h>


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
	  
#define SERVER_PORT 8888
#define BACKLOG	10
/*
 * socket
 * bind
 * listen
 * accept
 * send/recv
 **/
int main(int argc, char *argv[])
{
	int iSocketServer;
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;
	unsigned int serverport;
	
	int iAddrLen;
	unsigned char ucRecvBuf[1000];
	int iRecvLen;
	int iClientNum = -1;
	int opt = 1;
	
	int iRet;

	if(argc != 4)
	{
		printf("Usage:\n");
		printf("%s <net> <server_ip> <server_port>\n",argv[0]);
		return -1;
	}
	

	signal(SIGCHLD,SIG_IGN);
	

	
	iSocketServer =  socket(AF_INET, SOCK_STREAM, 0);
	if(iSocketServer == -1)
	{
		printf("init socket error\n");
		return -1;
	}

	/* 为套接字设置选项 */

	//一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
	
	iRet = setsockopt(iSocketServer, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));//地址可复用
	if(iRet < 0 )
	{
		printf("setsockopt error\n");
	}

	//绑定网卡
	struct ifreq ifr;
	strcpy(ifr.ifr_name, argv[1]);

	iRet = ioctl(iSocketServer, SIOCGIFADDR, &ifr);
	if(iRet < 0)
	{
		printf("ioctl [SIOCGIFADDR] failed");
		close(iSocketServer);
		return -1;
	}

	iRet = setsockopt(iSocketServer, SOL_SOCKET, SO_BINDTODEVICE, (char*)&ifr, sizeof(ifr));
	if(iRet < 0)
	{
		printf("setsockopt failed\n");
		close(iSocketServer);
		return -1;
	}


	//socket绑定地址
	tSocketServerAddr.sin_family 		= AF_INET;
	serverport 	= atoi(argv[3]); 
	printf("serverport:%d\n",serverport);
	tSocketClientAddr.sin_port			= htons((unsigned int)serverport);			//端口号
	
	tSocketServerAddr.sin_port	 		= htons(SERVER_PORT);	/* host to net, short */
	//tSocketServerAddr.sin_addr.s_addr 	= INADDR_ANY;			/* 检测所有ip */
	if(inet_pton(AF_INET, argv[2], &tSocketServerAddr.sin_addr) <= 0)	//可以用于IPV4或者IPV6
	{
		printf("invalid server_ip\n");
		close(iSocketServer);
		return -1;
	}
	memset(tSocketServerAddr.sin_zero, 0, 8);
	iRet =  bind(iSocketServer,  (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
	if(iRet < 0)
	{
		printf("bind error\n");
		return -1;
	}

	//监听
	iRet = listen(iSocketServer, BACKLOG);
	if(iRet < 0)
	{
		printf("listen error\n");
		return -1;
	}
	
	while(1)
	{
		iAddrLen = sizeof(struct sockaddr);
		iSocketClient = accept(iSocketServer,(struct sockaddr *)&tSocketClientAddr, &iAddrLen);
		//if(iSocketClient >0 )
		if (-1 != iSocketClient)
		{
			iClientNum++;
			printf("get connnect from client %d: %s\n", iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));
			fflush(stdout);
			if(!fork())
			{
				/* 子进程源码 */
				while(1)
				{
					//接受客户端的数据并显示出来
					iRecvLen = recv(iSocketClient, ucRecvBuf, 999, 0);
					if(iRecvLen <= 0)
					{
						close(iSocketClient);
						return -1;
					}
					else
					{
						ucRecvBuf[iRecvLen] = '\0';
						printf("Get message from client %d: %s", iClientNum, ucRecvBuf);
					}
				}
			}
		}
	}
	close(iSocketServer);
	return 0;
}

执行sudo ./server lo 127.0.0.1 8888

TCP client

#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>


#include <string.h>
#include <stdio.h>
#include <stdlib.h>

	  
#define SERVER_PORT 8888
#define CLIENT_PORT 1234

/*
 * socket
 * bind  //可以选择是否绑定到ip
 * connect
 * send/recv
 **/
int main(int argc, char *argv[])
{
	struct sockaddr_in tSocketServerAddr;
	struct sockaddr_in tSocketClientAddr;	//可以用于指定IP:port去连接服务器
	int iSocketClient;
	
	unsigned int clientport;
	unsigned int serverport;
	unsigned char ucSendBuf[1000];
	int iSendLen;
	int opt = 1;
	int iRet;
	
	if(argc != 5)
	{
		printf("Usage:\n");
		printf("%s <client_ip> <client_port> <server_ip> <server_port>\n",argv[0]);
		return -1;
	}
	
	iSocketClient =  socket(AF_INET, SOCK_STREAM, 0);
	if(iSocketClient == -1)
	{
		printf("init socket error\n");
		return -1;
	}
	//设置socket选项
	iRet = setsockopt(iSocketClient, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));//地址可复用
	if(iRet < 0 )
	{
		printf("setsockopt error\n");
	}
	
	//可以用于指定IP:port去连接服务器
	tSocketClientAddr.sin_family		= AF_INET;
	clientport 	= atoi(argv[2]); 
	printf("clientport:%d\n",clientport);
	tSocketClientAddr.sin_port			= htons((unsigned int)clientport);			//端口号
	
	if(inet_pton(AF_INET, argv[1], &tSocketClientAddr.sin_addr) <= 0)	//可以用于IPV4或者IPV6
	{
		printf("invalid client_ip\n");
		close(iSocketClient);
		return -1;
	}
	memset(tSocketClientAddr.sin_zero, 0, 8);
	iRet = bind(iSocketClient, (const struct sockaddr *)&tSocketClientAddr,sizeof(struct sockaddr));
	if(iRet < 0 )
	{
		printf("bind error\n");
	}
	
	
	/* 用于连接服务器 connect */
	tSocketServerAddr.sin_family 		= AF_INET;
	serverport = atoi(argv[4]);
	tSocketServerAddr.sin_port	 		= htons(serverport);	/* host to net, short */
	if(0 == inet_aton(argv[3], &tSocketServerAddr.sin_addr))
	{
		printf("invalid server_ip\n");
		close(iSocketClient);
		return -1;
	}
	memset(tSocketServerAddr.sin_zero, 0, 8);
	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))
		{
			//采用send或者sendto都可以。
#if 0
			iSendLen =  sendto(iSocketClient, ucSendBuf, strlen(ucSendBuf),0,
                      (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
#else
			iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf),0);
#endif
			if(iSendLen <=0 )
			{
				printf("send error\n");
				close(iSocketClient);
				return -1;
			}
		}
	}
	return 0;
}

执行./client 127.0.0.1 54321 127.0.0.1 8888

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

linux 下TCP通信例程 的相关文章

  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • 谁在 Mac OS X 上监听给定的 TCP 端口?

    在Linux上 我可以使用netstat pntl grep PORT or fuser n tcp PORT找出哪个进程 PID 正在侦听指定的 TCP 端口 如何在 Mac OS X 上获得相同的信息 在 macOS 上Big Sur然
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • Release file for http://xxx/ubuntu/dists/bionic-updates/InRelease is not valid yet报错解决

    参考 https blog 51cto com 5437315 2420097 中说明的原因 原因 xff1a 系统时间与网络时间 xff08 仓库 xff09 的不同导致更新错误 按照这个原因解释 xff0c 我查看了自己虚拟机内ubun
  • 如何在keil官网上下载 STM32包 pack

    https www 360kuai com pc 990a8ec633cf2109c cota 61 4 amp tj url 61 xz amp sign 61 360 57c3bbd1 amp refer scene 61 so 1
  • Makefile学习笔记系列1:一个简单的Makefile

    开启Makefile系列学习前 xff0c 先来个简单的 xff0c 没有子目录结构的例子 xff0c 只有一个makefile文件 目录结构 xff1a Makefile代码 xff1a XX 61 g 43 43 CFLAGS 61 g
  • PID控制算法的C语言实现

    PID控制算法的C语言实现一 PID算法原理 最近两天在考虑一般控制算法的C语言实现问题 xff0c 发现网络上尚没有一套完整的比较体系的讲解 于是总结了几天 xff0c 整理一套思路分享给大家 在工业应用中PID及其衍生算法是应用最广泛的
  • pageCache

    写在前面 在开始正式的讨论前 xff0c 我先抛出几个问题 xff1a 谈到磁盘时 xff0c 常说的HDD磁盘和SSD磁盘最大的区别是什么 xff1f 这些差异会影响我们的系统设计吗 xff1f 单线程写文件有点慢 xff0c 那多开几个
  • 基于Python高光谱遥感影像处理实例

    前言 在写波段配准相关代码时经常需要用到tif影像的波段合成和分解 xff0c 虽然可以用ENVI才处理 xff0c 但是每次都要打开再设置一些参数有些麻烦 xff0c 所以本着 独立自主 自力更生 的原则就写了些脚本来处理这个需求 又写了
  • 基于SIFT的图像Matlab拼接教程

    前言 图像拼接技术 xff0c 将普通图像或视频图像进行无缝拼接 xff0c 得到超宽视角甚至360度的全景图 xff0c 这样就可以用普通数码相机实现场面宏大的景物拍摄 利用计算机进行匹配 xff0c 将多幅具有重叠关系的图像拼合成为一幅
  • PERSIANN 降雨数据使用教程

    一 前言 PERSIANN xff0c 使用人工神经网络从遥感信息中估算降水 xff0c 是一种基于卫星的降水检索算法 xff0c 可提供近乎实时的降雨信息 该算法使用来自全球地球同步卫星的红外 IR 卫星数据作为降水信息的主要来源 红外图
  • 基于Pyqt5快速构建应用程序详细教程

    一 介绍 图形用户界面 xff0c 更广为人知的名称是 GUI xff0c 是当今大多数个人计算机的一个特征 它为不同计算技能水平的用户提供了直观的体验 尽管 GUI 应用程序可能会使用更多资源 xff0c 但由于其点击式特性 xff0c
  • 基于Python的PROSAIL模型介绍以及使用

    1 介绍 PROSAIL是两种模型耦合得到的 SAIL是冠层尺度的辐射传输模型 xff0c 把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层 xff0c 从而模拟入射辐射与均匀介质之间的相互作用 xff0c 具体还是挺复杂
  • 可能是最全的FreeRTOS源码分析及应用开发系列

    可能是最全的FreeRTOS源码分析及应用开发系列 FreeRTOS 是一个可裁剪的小型且免费的 RTOS 系统 xff0c 尺寸非常小 xff0c 可运行于微控制器上 其特点包括 xff1a 内核支持抢占式 xff0c 合作式和时间片调度
  • 关于VS中LNK1120与errorLNK2019问题

    最近遇到了该问题 xff0c 再查找了一些资料后 xff0c 发现了针对自己问题的解决方法 xff0c 贴出来让大家一起学习一下 其实如果这两个问题同时出现 xff0c 很可能不是链接库缺了lib xff0c 而是编译中添加的源没有被实例化
  • PCL—低层次视觉—点云分割(基于凹凸性)

    转自 xff1a http www cnblogs com ironstark p 5027269 html PCL 低层次视觉 点云分割 xff08 基于凹凸性 xff09 1 图像分割的两条思路 场景分割时机器视觉中的重要任务 xff0
  • 【ENVI入门系列】13.分类后处理

    原文地址 xff1a ENVI入门系列 13 分类后处理 作者 xff1a ENVI IDL中国 版权声明 xff1a 本教程涉及到的数据提供仅练习使用 xff0c 禁止用于商业用途 目录 分类后处理 1 概述 2 分类后处理 2 1 小斑
  • ENVI神经网络工具参数和使用方法

    原文地址 xff1a ENVI神经网络工具参数和使用方法 作者 xff1a pengheligis xff08 1 xff09 Activation xff1a 选择活化函数 对数 xff08 Logistic xff09 和双曲线 xff
  • 详解使用pscp命令Linux文件上传与下载

    一 上传 2 开始 运行 cmd进入到 dos模式输入以下命令 以下是代码片段 xff1a pscp D java apache tomcat 5 5 27 webapps szfdc rardev 64 192 168 68 249 ho
  • java学习总结及心得体会

    前言 xff1a 哈哈 xff0c 今天是2015年 xff18 月 xff12 号 xff0c 星期日 xff0c 今天是收货的一天 xff0c 很开心 xff0c 很快乐 到底发生了什么呢 xff0c 容我慢慢来 世界很大 xff0c
  • 二进制的表白

    没能提起勇气对她进行表白 xff0c 只能寄托于0 1代码记录下对你的喜欢 01000101 01110110 01100101 01101110 00100001 01001001 00100000 01101100 01101111 0
  • C语言strcat()函数:连接字符串

    头文件 xff1a include lt string h gt strcat 函数用来连接字符串 xff0c 其原型为 xff1a char strcat char dest const char src 参数 dest 为目的字符串指针
  • linux 下TCP通信例程

    TCP server span class token macro property span class token directive hash span span class token directive keyword inclu