网络编程外网通信

在这里插入图片描述

来源:微信公众号「编程学习基地」

对于初学者而已,我们学习的网络编程(如TCP,UDP编程),我们通常都是在局域网内进行通信测试,有时候我们或者会想,我们现在写的内网网络数据和外网的网络数据有什么不同,我们内网的数据是如何走出外网的呢?

公有 IP 和私有 IP 的区别

首先,我们需要了解一下什么是公有 IP 和私有 IP

公有地址(Public address):由 Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些 IP 地址分配给注册并向Inter NIC提出申请的组织机构,公有 IP 全球唯一,通过它直接访问因特网(直接能上网)。

私有地址(Private address):属于非注册地址,专门为组织机构内部使用,说白了,私有 IP 不能直接上网。

而我们平时通过运营商(电信、移动、联通宽带等)上网,家里面通过路由器分出来的 IP 都是私有 IP(局域网 IP),大家可能会疑问,我们可以上网啊,怎么会是私有 IP 呢?

而我们平时通过运营商(电信、移动、联通宽带等)上网,家里面通过路由器分出来的 IP 都是私有 IP(局域网 IP),大家可能会疑问,我们可以上网啊,怎么会是私有 IP 呢?

租用(申请)公有 IP 是需要钱的。 运营商买了一些公有 IP,然后通过这些公有 IP 分出来,再分给一个一个的用户使用。这个过程有点类似于,我们去安装了宽度,通过路由器分出几个 IP,让好几个人都能上网,当然运营商通过公有 IP 分出来的过程肯定比这个复杂多了。所以,我们平时上网用的 IP 是私有 IP,真正拥有公有 IP 的是运营商(当然,我们可以租用一个公有 IP )。

我们可以上网啊,怎么会是私有 IP 呢?

接下来,给大家介绍一下什么是端口映射

端口映射是 NAT 的一种,它将外网主机的 IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。

现在市场上的家庭路由器都具备 NAT 功能。

如何让外网能够访问自己写的网络程序(服务器)

首先,我们需要在运营商那边申请(租用)一个公有 IP (学生机有优惠),假如这个公有 IP 为:122.112.174.128,服务器上后台运行了一个简易聊天室,监听的端口是 6666 。

那么可以访问外网(ping通)的电脑主机就可以去连接这个服务器,然后进行数据交互。

如何让服务器后台执行

服务器是后台运行的,通过ps -A | grep s 查看服务器,通过 kill -9 进程id 杀死服务

[root@ecs-x-medium-2-linux-20200312093025 ~]# ps -A | grep s
23388 ?        00:00:00 s

后台执行的实现也很简单,了解守护进程即可,总结就是调用下面函数

#include <unistd.h>
int daemonize()
{
    pid_t pid = fork();
    if ( pid < 0 )
    {
        return 0;
    }
    else if ( pid > 0 )
    {
        exit( 0 );
    }
    umask( 0 );
    pid_t sid = setsid();
    if ( sid < 0 )
    {
        return 0;
    }
    if ( ( chdir( "/" ) ) < 0 )
    {
        /* Log the failure */
        return 0;
    }
    close( STDIN_FILENO );
    close( STDOUT_FILENO );
    close( STDERR_FILENO );

    open( "/dev/null", O_RDONLY );
    open( "/dev/null", O_RDWR );
    open( "/dev/null", O_RDWR );
    return 1;
}

小本本记上,也可以收藏文章。

外网通信实例

服务器上运行了server服务端之后,在可以访问外网的主机上运行客户端

在这里插入图片描述

本地没有开启服务端,客户端绑定的ip地址是公网ip地址,端口是6666.

最后稍微改了下一口君的程序就发出来了,后面有时间我再自己写一个epoll的聊天室,代码发送关键字聊天室获取,客户端编译运行可以一起聊天(要装虚拟机)。服务端代码也可以一并获取

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeRoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值