搭建互联网可访问的TCP服务器(基于Ngrok实现)

2023-05-16

基于Ngrok 内网穿透的TCP服务器

实现目的:在本地搭建TCP服务器,通过Ngrok 内网穿透,把本地TCP服务器的端口映射到互联网上,达到通过TCP 在互联网上访问本地服务器的目的。

物理环境:树莓派4B 4G

系统:Ubuntu 22.04

一、项目准备

1.获得Ngrok 内网穿透隧道的域名和端口号;

2.把树莓派上安装隧道客户端,并运行客户端,使隧道打开;(这个时候,可以通过隧道供应商提供的域名和端口号通过ssh 访问树莓派服务器,ssh使用的端口号为:22);

3.在隧道供应商处修改本地端口为 127.0.0.1:8765(冒号后面的端口号要大于5000,随自己喜欢都可以);

4.在树莓派上编译一下代码

文件名:sever.c

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

int main(int argc, const char *argv[])
{
	if(argc<2)
	{
		fprintf(stderr,"usage:%s 8888",argv[0]);
		return 0;
	}
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0)
	{
		perror("Fail to socket");
		return 0;
	}
	struct sockaddr_in saddr,caddr;

	//socklen_t caddr_len;
	memset(&saddr,0,sizeof(saddr));
	memset(&caddr,0,sizeof(caddr));
	saddr.sin_family=AF_INET;
	saddr.sin_port=htons(atoi(argv[1]));
	saddr.sin_addr.s_addr=htons(INADDR_ANY);

	int ret=bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
	if(ret<0)
	{
		perror("Fail to bind");
		return 0;
	}

	ret =listen(sockfd,5);
	if(ret<0)
	{
		perror("Fail to listen");
		return 0;
	}

	int caddr_len=0;
	caddr_len=sizeof(struct sockaddr);
	
	while(1)
	{
		int connfd=accept(sockfd,(struct sockaddr *)&caddr,&caddr_len);
		if(connfd<0)
		{
			perror("Fail to accept");
			return 0;
		}
		char buf[1024]={0};
		while(1)
		{
			memset(buf,0,sizeof(buf));
			ret=read(connfd,buf,sizeof(buf));
			if(ret==0)
			{
				printf("客户端异常退出!\n");
				break;
			}
			else if(ret==-1)
			{
				perror("Fail to read");
				break;
			}
			if(strncmp("quit",buf,4)==0)
			{
				printf("客户端主动退出!\n");
				break;
			}
			printf("read: %d bytes:%s",ret,buf);

			write(connfd,buf,ret);
		}
		close(connfd);
		write(connfd,buf,ret);


	}

	close(sockfd);
	return 0;
}

编译服务器,并运行。

gcc sever.c//编译
./a.out 8765 //运行服务器,8765为端口号

5.在其他电脑上运行TCP工具,运行TCP客户端,输入隧道供应商提供的域名和端口号,开启TCP连接,此时接收到字符串 hello,说明TCP 连接成功,发送消息,服务器会把消息回发给客户端,TCP连接成功。

linux 中 nc 是tcp/udp调试工具(俗称脑残)
在这里插入图片描述

6.遇到的问题:Fail to accept :Invalid argument ;当客户端连接的瞬间,服务器停止运行。

在这里插入图片描述

解决办法:服务器代码中accept ()函数中,把addrlen这个参数在使用前初始化一下:

//把accept函数修改如下
int addr_len=0;
addr_len=sizeof(struct sockaddr);
int counnd=accept(sockfd,(struct sockaddr *)&caddr,&addr_len);
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
//返回值:成功返回通信套接字,失败返回-1;
//addr :客户端的地址结构的首地址;
//addrlen:客户端地址结构体的大小的首地址;
//注:若不想接受客户端的地址信息,addr与addrlen两个参数填NULL;

accept ()函数用法参考TCP通信相关函数。

7.总结:通过Ngrok隧道,把本地端口映射到互联网,从而实现,互联网访问本地服务器。在学习网络编程时,可以把只能在局域网内调试的TCP、UDP 多进程、多线程服务器通过这个思路,实现互联网连接,真的很赞!。

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

搭建互联网可访问的TCP服务器(基于Ngrok实现) 的相关文章

  • C# 服务器和 Java 客户端:TCP 套接字通信问题

    我用 C 编写了一个服务器程序TCPListner和一个使用套接字的 Java 客户端程序 但我无法将复杂的对象从 Java 客户端发送到 C 服务器 当我通过将字符串转换为字节数组从 Java 客户端发送到 C 服务器时 当转换回字符串时
  • 如何将我的 Kivy 客户端连接到服务器(TCP、套接字)

    因此 作为我的项目 2D 多人纸牌游戏 的一部分 我已经弄清楚如何在线托管和运行服务器脚本 我的计划是让两个单独的 kivy 客户端连接到服务器 这只是一个带有命令的脚本 但是我对操作顺序有些困惑 因为我think客户端连接可能与消息循环发
  • Boost ASIO:服务器如何知道客户端是否仍然连接?

    我在用boost asio对于服务器 客户端应用程序 服务器一次只接受一个连接 我想知道服务器验证客户端是否仍然连接的最佳方法是什么 这样做的目的是我希望能够知道客户端是否崩溃 以便我可以重新开始侦听新的连接尝试 在我的应用程序中 我使用以
  • 无法通过 ngrok ssh 进入远程 Linux

    远程Linux计算机位于内部网络中 没有公共IP地址 所以我安装了ngrok ngrok tcp 22 ngrok by inconshreveable Ctrl C 退出 在线隧道状态版本2 0 19 2 0 17网页界面http 127
  • 如何在 MAC OS X 中获得最大 TCP 接收/发送窗口?

    如何在 MAC OS X 中获得最大 TCP 接收 发送窗口 Linux中有两个ctl proc sys net core rmem max 最大 TCP 接收窗口 NET CORE RMEM MAX proc sys net core w
  • 通过 TCP 客户端套接字接收数据时出现问题

    我正在尝试用 C 语言编写一个 TCP 客户端程序 客户端将在其中启动 连接到服务器 然后它会发送一些信息 然后监听它收到的信息并做出相应的反应 我遇到麻烦的部分是持续聆听 这是我所拥有的 while 1 numbytes recv soc
  • Socket ReceiveAsync 合并数据包

    我打算通过套接字接收数据包 但由于它们是从发送方以高频率发送的 因此其中许多数据包被打包成一个byte array SocketAsyncEventArgs Buffer然后保存多个数据包 即使它们是单独发送的 使用验证wireshark
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • Go TCP 读取是非阻塞的

    我正在尝试用 Go 创建服务器和客户端 我已经成功地与服务器和客户端进行通信 但我遇到的问题是golang中的TCP读取是非阻塞的 我想知道 golang 中的读取是否有可能像 C 中的读取一样阻塞 谢谢 EDIT 这是服务器的源代码 fu
  • PHP 上的多个 TCP 套接字请求

    是否可以使用 PHP 上的套接字服务器接受多个请求 并行 如果可以的话 怎样做 普通的 PHP 脚本无法接收多个请求 但如果你真的计划创建一个套接字服务器 作为 cmdline php 脚本启动 那么是的 这是可能的 调查http pear
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 我应该害怕使用 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/IP 套接字进行 IPC 时,常见的网络堆栈是否会跳过将消息帧封装在较低级别的 PDU 中?

    在某些环境 例如 Java 中 很自然地使用 TCP IP 套接字通过 localhost 地址 IPv4 中的 127 0 0 1 或 IPv6 中的 1 在同一主机上的进程之间传递消息 因为Java倾向于不在其API中公开其他IPC机制
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未

随机推荐

  • Ubuntu安装cuda与cudnn,亲测可用

    文章目录 前言一 安装显卡驱动二 安装cuda三 安装cudnn总结 前言 前段时间被派到现场去部署算法 xff0c 之前同事搭好cuda的环境不好用了 xff0c 具体表现为 xff1a 1 屏幕的分辨率显示很奇怪且不可调节 2 输入nv
  • 实现对python源码加密的方法

    文章目录 前言一 将py文件编译成pyc二 将py转化成so文件2 1准备工作2 2新建py2so py文件2 3编译项目文件夹 总结 前言 由于项目的保密性需求 xff0c 对已开发完成的项目需要进行加密处理 xff0c 本文给出两种方法
  • python配置文件的两种方式

    文章目录 前言py文件作为配置文件yaml文件作为配置文件总结 前言 在运行项目程序时通常会有一个配置文件 xff0c 配置文件是用于配置程序的参数和初始化设置的文件 比如现在要做一个项目 xff0c 在部署程序时 xff0c 需要摄像头I
  • Ubuntu18.04安装OpenPCDet:spconv一键安装

    文章目录 前言本机安装环境安装Spconv安装pcdetclone 项目创建并配置虚拟环境安装pcdet 总结 前言 最近在摸索点云数据的处理 xff0c 希望实现对点云数据的目标检测 但是在复现PointPillars算法时遇到很多坑 x
  • OpenPCDet 训练自己的数据集详细教程!

    文章目录 前言一 pcd转bin二 labelCloud 工具安装与使用三 训练仿写代码对pcdet datasets custom custom dataset py进行改写新建tools cfgs dataset configs cus
  • Ubuntu16.04 用Nomachine进行远程控制的配置

    本文介绍如何在Ubuntu16 04环境下运用Nomachine进行远程控制 一 NoMachine介绍 NoMachine是一款基于NX技术进行远程控制的软件 xff0c 最大的优势是跨平台 xff0c 简单 xff0c 可以实现Linu
  • ROS一键安装

    文章目录 前言ROS一键安装总结 前言 这段时间接触到了雷达点云数据 xff0c 用到了ROS系统 xff0c 在安装过程中完成了手动安装 xff0c 也尝试了一键安装 xff0c 特此记录下一键安装方法 ROS一键安装 wget http
  • labelimg voc与yolo数据标签互转脚本

    xml2txt span class token keyword import span os span class token punctuation span path span class token keyword import s
  • yolov5标签数据增强脚本

    此代码用于将标注好的图片及其标签进行数据增强 xff0c 优点在于不需要重新打标签 span class token keyword import span xml span class token punctuation span etr
  • shell定时删除N天前的文件

    脚本代码 新建del img sh脚本文件 find span class token operator span data span class token operator span images span class token op
  • Triton推理服务器吞吐量测试

    文章目录 前言安装测试环境测试启动测试环境对比同一模型不同并发数的吞吐量对比同一模型不同实例数的吞吐量 总结 前言 性能分析器是优化模型性能的重要工具 xff0c 决定如何在单个 GPU 上最好地运行多个模型 安装测试环境 拉取镜像 doc
  • Open3D实时点云显示

    文章目录 前言代码总结 前言 一般情况我们通过open3d中的draw geometries 进行点云可视化 xff0c 但这个函数会锁定一个进程直到可视化的窗口被关闭 xff0c 才会继续渲染下一帧点云图像 xff0c 无法做到点云持续的
  • python自动测试ping IP

    python自动测试ping IP 将不通的IP保存到txt中 span class token comment coding utf 8 span span class token comment 64 Time 2023 3 6 9 1
  • spring security 拦截了post put delete 请求 ,解决方案

    使用spring security 做的安全框架时 xff0c 会自动拦截post xff0c put xff0c delete等请求 xff0c 这时因为spring security 开启了防止跨域访问攻击的配置 xff0c 那么怎么解
  • java后台接收不到delete请求发送的参数

    解决方案十分简单 xff0c 只需要改写你的js请求的方式 xff1a 39 btn delete 39 on 34 click 34 function ajax type 34 POST 34 url 34 order 34 data 3
  • Mac回收站清空还能恢复吗?2个方法快速找回废纸篓清空文件

    Mac回收站清空还能恢复吗 xff1f 使用Mac苹果电脑的用户都知道废纸篓 xff08 即回收站 xff09 xff0c 是一个非常好用的功能 xff0c 它可以将用户所有删除的文件给集合到一起 xff0c 在用户后悔的时候可以还原 不过
  • Debian 遇到的问题及解决办法

    1 bash fdisk command not found 安装完ntfs驱动后 xff0c fdisk命令不能用了 from http hi baidu com zengjianyuan blog item f019f7d39242c4
  • centos个性化命令行提示符

    为了在满屏的命令中找到用户的命令行 xff0c 所以很有必要设置一种字体颜色 我就设置最实用的一种 xff0c 可以用蓝色字体显示当前所在路径 命令行输入 xff1a echo 34 PS1 61 39 debian chroot 43 d
  • stm32f103c8t6最小系统板烧录程序

    stm32f103c8t6最小系统板烧录程序 连接好线路 xff0c 却无法使用串口给stm32f103c8t6最小系统板下载程序 一 串口下载 xff08 使用flyMCU 1 接线如下图 xff0c 特别注意 xff0c boot0必须
  • 搭建互联网可访问的TCP服务器(基于Ngrok实现)

    基于Ngrok 内网穿透的TCP服务器 实现目的 xff1a 在本地搭建TCP服务器 xff0c 通过Ngrok 内网穿透 xff0c 把本地TCP服务器的端口映射到互联网上 xff0c 达到通过TCP 在互联网上访问本地服务器的目的 物理