Linux C简易聊天室

news/2025/3/29 19:39:16/

对于初学者而已,我们学习的网络编程(如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的聊天室,代码发送关键字聊天室获取,客户端编译运行可以一起聊天(要装虚拟机)

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

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


http://www.ppmy.cn/news/310768.html

相关文章

软考A计划-系统架构师-官方考试指定教程-(15/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

leetcode第314场周赛补题

第一题&#xff1a;6200. 处理用时最长的那个任务的员工 原题链接 思路&#xff1a;简单模拟&#xff0c;遍历取最大值即可 class Solution { public:int hardestWorker(int n, vector<vector<int>>& logs) {int res logs[0][0];int sum logs[0][1];for(in…

Android 搜索内容保存历史记录

Android 搜索内容保存历史记录 一、界面布局 主界面布局 activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.and…

Android Studio入门之文本内容、大小、颜色的讲解及实战(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言或私信博主 一、设置文本的内容 1:在XML文件中通过属性android:text设置文本 <TextViewandroid:layout_width"wrap_content"android:layout_height"wrap_content"android:text"Hello World!"…

Compose (9/N) - 主题 Theme

一、Material Design 直接把任何Composable函数用 MaterialTheme{ } 包裹起来&#xff0c;就可以使用相关属性了。也可以单独将某个属性拿出来使用。 1.1 颜色 Color primary 主色&#xff0c;屏幕和元素都用这个颜色。 primaryVariant 用于区分主色&#xff0c;比如app bar和…

android 登录注册动画,Android开发(14)——动画实战:炫酷登录

本节内容 1.第三方库实现虚化 2.添加输入框和按钮 3.按钮状态 4.键盘隐藏 5.监听焦点改变的事件 6.手臂旋转动画 7.手掌和手臂动画 Demo简介 1.做一个炫酷登录的界面。 image.png 当我们输入密码的时候&#xff0c;猫头鹰会捂住眼睛。点击其他地方后&#xff0c;它的手臂又会张…

Android开发帮助技巧(适用于入门)二

Android配置配置清单&#xff0c;Gradle构建文件&#xff0c;外部化资源部分。 &#xff08;一)配置清单AndroidManifest.xml use-permission和uses-feature和application属于同等级节点。 android:allowBackup 是否允许应用参与备份和恢复基础架构。如果将此属性设为 fals…

【php + MySQL + Android】Android登陆界面设计(1)

前言 自己要做一个Android App&#xff0c;涉及到服务器端的用户数据管理&#xff0c;而网络上的的资源往往是只讲一个方面。所以自己每完成一段工作&#xff0c;会将开发过程记录下来&#xff0c;并供大家参考&#xff0c;相关文章放在专栏 【php MySQL Android】。 如果…