Linux C简易聊天室

对于初学者而已,我们学习的网络编程(如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 。

Linux C简易聊天室_第1张图片

那么可以访问外网(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 
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服务端之后,在可以访问外网的主机上运行客户端

Linux C简易聊天室_第2张图片

在这里插入图片描述

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

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

VMware下Ubuntu16.04镜像完整安装配置教程

服务端代码也可以一并获取.

你可能感兴趣的:(linux,c语言,网络)