linux下TCP/IP通讯实例

2023-05-16

下面是server端源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <time.h>

void error_handling(char *msg);

void getLocalIP(char *ip){
    int inet_sock;  
    struct ifreq ifr;   

    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);  
    strcpy(ifr.ifr_name, "eth0");  
    ioctl(inet_sock, SIOCGIFADDR, &ifr);  
    strcpy(ip, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));  
}
int main(int argc,char *argv[])
{
    int serv_sock_fd;
    int clnt_sock_fd;

    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    socklen_t clnt_addr_size;

    char message[1024];
	int rcv_len;
	
	time_t timer;//time_t就是long int 类型
	struct tm *tblock;
	char local_ip[32]={0};
	
	getLocalIP(local_ip);
	printf("\r\ngetLocalIP=%s\r\n",local_ip);//获取本机IP地址
//    if (argc != 2)
//    {
//        printf("Usage: %s <port>\n", argv[0]);
//        exit(1);
//    }
	serv_sock_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (serv_sock_fd == -1)
		error_handling("sock() 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 = 8080;//htons(atoi(argv[1]));//监听端口

	if (bind(serv_sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
		error_handling("bind() error");

	if (listen(serv_sock_fd, 5) == -1)
		error_handling("listen() error");
	
	while(1)
	{
		clnt_addr_size = sizeof(clnt_addr);
		clnt_sock_fd = accept(serv_sock_fd, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
		if (clnt_sock_fd == -1)
			error_handling("accept() error");
		rcv_len = read(clnt_sock_fd, message, sizeof(message) - 1);
		timer = time(NULL);
		tblock = localtime(&timer);
		printf("%sMessage send: %s\n", asctime(tblock),message);
		write(clnt_sock_fd, message, sizeof(message));//将收到的数据发送出去
		close(clnt_sock_fd);
		usleep(1000);
	}
	close(serv_sock_fd);
    printf("\r\nserver end.\r\n");
    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

下面是client端源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <time.h>
void error_handling(char *msg);
void getLocalIP(char *ip){
    int inet_sock;  
    struct ifreq ifr;  

    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);  
    strcpy(ifr.ifr_name, "eth0");  
    ioctl(inet_sock, SIOCGIFADDR, &ifr);  
    strcpy(ip, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));  
}
int main(int argc,char *argv[])
{
	
    int sock_fd;
    struct sockaddr_in serv_addr;
    char message[1024] = {0};
    int rcv_len,package=0;

	time_t timer;//time_t就是long int 类型
	struct tm *tblock;
//    if (argc != 3)
//    {
//        printf("Usage: %s <IP> <port>\n", argv[0]);
//        exit(1);
//    }

	char local_ip[32];
	getLocalIP(local_ip);
	printf("\r\ngetLocalIP=%s\r\n",local_ip);//获取本机IP地址,作为远端服务器IP地址
	while(1)
	{
		sock_fd = socket(AF_INET, SOCK_STREAM, 0);
		if (sock_fd == -1)
			error_handling("sock() error");
		memset(&serv_addr, 0, sizeof(serv_addr));
		serv_addr.sin_family = AF_INET;
		serv_addr.sin_addr.s_addr = inet_addr(local_ip);//server's IP addr
		serv_addr.sin_port = 8080;//htons(atoi(argv[2]));//server's port

		if (connect(sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
			error_handling("connect() error!");

		sprintf(message,"This is a sample TCP client!\t%d",package++);
		write(sock_fd, message, sizeof(message));//将收到的数据发送出去
		usleep(10000);
		rcv_len = read(sock_fd, message, sizeof(message) - 1);
		if (rcv_len == -1)
			error_handling("read() error!");
		
		timer = time(NULL);
		tblock = localtime(&timer);
		printf("%sMessage receved[%d]: %s\n", asctime(tblock),rcv_len,message);
		close(sock_fd);
		usleep(10000);
	}
	printf("\r\nclient end.\r\n");
    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

分别gcc编译后,先运行server,再运行client,会不停有数据打印,恭喜成功了。

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

linux下TCP/IP通讯实例 的相关文章

  • :: 右侧的非法标记

    我有以下模板声明 template
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 是否有我可以运行的操作系统命令来确定是否在基于 Xen 的虚拟机内运行

    我可以在基于 Xen 的虚拟机中运行一个操作系统命令来告诉我它是一个虚拟机而不是物理机 我听说内核对此有一些自我意识智能 例如就像 ps 输出中的额外列之类的 我知道 vmstat 提供了 st 列 但我在运行 Linux 内核 2 6 1
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0

随机推荐

  • 两个大数(包括负数)相加

    分析 xff1a 当这两个大数为正数时 xff0c 我们可以将字符转化为数字相加 xff0c 再加进位talg xff0c 有进位为1 xff0c 否则为0 xff1b 两个为负数则与正数相似 xff0c 为一正一负时 xff0c 我们可以
  • WRF模式运行的流程以及简单错误的避免

    前提安装好 WPS 43 WRF 43 WRFDomainWizard等组件 一 xff0c WPS 1 xff0c geogrid exe 准备静态数据 地理数据 2 xff0c ungrib exe 解压强迫场资料 气象数据 3 xff
  • 两台计算机之间的直连

    1 xff0c 直连线的要求 xff0c 需要交叉线 2 xff0c 在网络里打开适配器选项 xff0c 右击以太网 xff0c 打开属性 xff0c 双击IP4 xff0c 如图所示 IP地址设置如上图 3 xff0c 另一台计算机的设置
  • MP3转码PCM

    支持aac和mp3转码 xff0c 主要是dst nb sample的计算 xff0c aac大致为1024 xff0c MP3为1152 xff0c static int dst nb samples 61 0 define SWR in
  • RISC-V MCU 导盲手套

    RISC V MCU 导盲手套 关于本文队伍名称第一部分 设计概述1 1 设计目的1 2 应用领域1 3 主要技术特点1 4 关键性能指标1 5 主要创新点 第二部分 系统组成及功能说明2 1 整体介绍2 2 各模块介绍 第三部分 完成情况
  • 告别VMWARE!开源,免费,高效率,跨平台的

    与所有Linux爱好者一样 xff0c 对Windows的感情都是虽然不喜欢 xff0c 但是有些时候还真离不开这个玩意 那怎么办呢 xff1f 虚拟机 xff01 最早接触的虚拟机是virtualpc xff0c 这个软件自从被微软收购之
  • 保护机制

    一 SSP Stack Smashing Protection SSP属于编译器层面的防护 具体实现 1 xff0c 在栈中 xff0c ebp与变量之间插入随机值canary xff0c 用于监视是否栈溢出 xff1b 2 xff0c 在
  • Linux系统溢出漏洞学习

    系统环境 xff1a Linux 3 0 0 12 generic athlon DISTRIB DESCRIPTION 61 34 Ubuntu 11 10 34 gcc Ubuntu Linaro 4 6 3 1ubuntu5 4 6
  • db dw dd 与equ的区别

    此前在写汇编的过程中 xff0c 一直不理解两者间的区别 xff0c 例如 xff1a address1 dw 1000h address2 equ 2000h mov ax address1 mov bx address2 db dw d
  • c++/cmake/cmakelists/cmakelists子目录的添加

    cmake minimum required VERSION 3 10 project learning to create project set CMAKE CXX STANDARD 11 set LIBRARY OUTPUT PATH
  • RoboMaster怎么设计新步兵悬挂

    流程 xff1a 明确需求 gt 提出可量化目标 gt 方案提出与评估 gt 细化方案 gt 任务分配 gt 画图设计 gt 图纸提交与验收 gt 加工 gt 装配 gt 机械调试 需求 xff1a 性能优越的悬挂 目标 xff1a 1 任
  • windows7资源管理器无响应的解决方案

    windows7使用过程中常常会出现资源管理器无响应 xff0c 分多种情况 xff1a 1 xff0c 由于第三方程序大量占用内存 xff0c 系统响应速度变慢 xff0c 选择等待程序响应 xff0c 过一段时间即可恢复正常 xff1b
  • 黑客技巧:Google hacking实现以及应用

    前言 google hacking其实并算不上什么新东西 在早几年我在一些国外站点上就看见过相关的介绍 但是由于当时并没有重视这种技术 认为最多就只是用来找找未改名的mdb或者别人留下的webshell什么的 并无太大实际用途 但是前段时间
  • C语言string库函数介绍(附模拟实现)

    目录 strlen 模拟实现 strcpy 模拟实现 strcat 模拟实现 strcmp 模拟实现 strncpy strncat strncmp strstr 模拟实现 strlen size t strlen const char s
  • Realsense D435i Yolov5目标检测实时获得目标三维位置信息

    文章目录 一 效果演示二 环境配置三 模型配置四 相机配置五 部分代码 六 仓库链接 一 效果演示 Colorimage Colorimage and depthimage 二 环境配置 1 一个可以运行YOLOv5的python环境 pi
  • C语言中return的各种用法

    转自 xff1a https www pinlue com article 2021 06 2614 1611638969328 html
  • 从零开始搭二维激光SLAM --- 激光雷达数据效果对比

    我们知道 xff0c 不同品牌的激光雷达产生的数据是不一样的 xff0c 那这些不同点是如何影响建图效果的呢 xff1f 这篇文章就是来分析这个问题 xff0c 将从不同光强下的点云效果 xff0c 不同夹角下的点云效果 xff0c 以及
  • 海上垂直无人机垂直起降平台

    无人机的降落要实现对飞行轨迹和飞行状态的精确控制 xff0c 对目标地点的精确定位与识别 xff0c 而海上无人机降落具有更多不确定因素 xff0c 现提出一些有效方案 xff0c 以使得无人机海上起降成为可能 无人机起降条件 xff1a
  • 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块

    前言 前段时间跟着LOLI大神的教程制作了LOLI三代控 xff0c 效果很好 但是 xff0c 由于LOLI三代控的接收机带有数据回传功能 xff0c 也就是接收机的无线模块也承担了发射数据功能 xff0c 所以接收机也要使用带有功率放大
  • linux下TCP/IP通讯实例

    下面是server端源码 xff1a include lt stdio h gt include lt stdlib h gt include lt string h gt include lt unistd h gt include lt