Linux下TCP转发编程知识点记录

24 篇文章 0 订阅
19 篇文章 0 订阅

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:https://github.com/vakuum/tcptunnel
参考:https://zhihu.com/question/48161206

下面是写linux下tcp转发编程时,遇到的几个知识点,记录如下:

1. fork:创建子进程通信

服务端接受到请求后,fork出子进程,然后使用子进程与client通信

while(true)
{
        // accept link from client
        ...
        // muti processes
        int forkid = fork();
        if (forkid == 0)
        {
           // main process
           close(clifd);
           continue;
        }
        else if (forkid < 0)
        {
           fprintf(stdout, "error occur on fork");
           continue;
        }
        // child process, communicate with client
        close(servfd);
}

2. mmap:进程间共享内存shared memory

mmap可以建立一个映射,用于进程间的内存数据共享。

    // share memory bettwen process
    struct sockaddr_in *pLocal = (sockaddr_in*)mmap(0, sizeof(sockaddr_in), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
    struct sockaddr_in &local = *pLocal;
    while(true)
    {
         ...
         // child process: update data
	     local = cli;
	     ...
	     munmap(pLocal, sizeof(sockaddr_in));
         break;
    }

3. setsockopt:设置socket超时参数

消息通信时,时常会遇到通信线路异常,或者超时等各类情况,recv接受消息时设置超时通常会是必不可少的。

        // set time out 
       struct timeval tv;
       tv.tv_sec = 15;
       tv.tv_usec = 0;
       setsockopt(clifd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv));

4. select: 检查多个socket变化

select支持检查多个socket的变化,可以检查到这些socket是否有数据过来;

fd_set fdset;
while(true)
{
    FD_ZERO(&fdset);
    FD_SET(clifd, &fdset);
    FD_SET(servfd, &fdset);
    int maxfd = clifd > servfd ? clifd+1 : servfd + 1;
    if ((rt=select(maxfd, &fdset, NULL, NULL, &tv)) <= 0)
        break;
    if (FD_SET(clifd, &fdset)){
        ...
    }
    if (FD_SET(servfd, &fdset)){
       ...
    }
}

5. signal: 使用signal关闭主进程对子进程的关注

消息中主进程并不关注子进程是否处理完毕,是否已结束。如果不做作何处理,子进程会成为defunct状态。在主进程提前声明可以避免这种情况。

#include <sys/types.h>
#include <sys/wait.h>
...
// main process
signal(SIGCHLD,SIG_IGN);
...

6. 允许端口重复绑定

允许端口被重复绑定的意义有两个:第一个是解决结束进程时,端口还会被占用一会,此时启动会失败;另一个意义在于可以通过启动多进程,形成多个进程同时服务的效果。

int opt = 1;
setsockopt(srvfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(srvfd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

本软件由服务端 、 客户端和采集端三部分组成,用于将采集端计算机上的 TCP 端口映射 到客户端计算机 上,使 客户端计算机上的应用软件可以像访问本机上的 TCP 端口一样访问采 集端计算机上的 TCP 端口。注:采集端也被称作监测点。 本软件的采集端可以运行在 X86-Linux 、 ARM7-ucLinux 或 Windows 2000/XP 系统 上,本软件的客户端和服务端只能运行在 Windows 2000/XP 系统上。 本软件要解决的问题:如下图所示,采集端计算机(采集端 1)是一台运行 Linux 操作系 统的X86 嵌入式计算机,通过ADSL 接入Internet,该计算机上开有Telnet服务(TCP-23) 。 因网络设备限制,只允许该计算机访问外界计算机,而外界计算机无法访问该计算机的 TCP- 23 端口。客户端计算机(客户端 3)是某公司内部网络中的一台运行 Windows2000 操作系 统的计算机,通过公司的交换机接入 Internet。因为采集端计算机网络设备的限制,客户端 计算机无法访问采集端计算机上的 Telnet 服务。 为使采集端计算机上的 Telnet 服务可被客户端计算机 访问,在 客户端计算机上运行 TCP 中转站客户端软件,在采集端计算机上运行 TCP 中转站采集端软件。运行 TCP 中转站服务 端软件的服务器,是一台运行 Windows2000 系统有公网 IP 的计算机,客户端计算机和采 集端计算机均可以访问该服务器。 TCP 中转站软件将把采集端计算机的 TCP-23 端口映射到客户端计算机上,使用客户端 计算机的操作者用 Telnet 命令或 PuTTY 软件访问本机的 TCP-23 端口,即可与采集端计算 机的 TCP-23(Telnet 服务)通讯。每个客户端计算机可以映射多个采集端计算机的多个 TCP 端口,在客户端计算机上为每个映射的采集端计算机分配一个私有 IP:127.1.0.X 。例如: 客户端计算机与三台采集端计算机建立了映射,则这三台采集端计算机分别映射到这台客户 端计算机的 127.1.0.11、127.1.0.12 和 127.1.0.13 三个私有 IP 地址上,如果客户端计 算机上的应用软件(例如 PuTTY)访问本台计算机私有 IP 127.1.0.11 的 TCP23 端口,则应 用软件(PuTTY)实际访问的是采集端计算机 1 的 TCP-23 端口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春夜喜雨

稀罕你的喜欢!!

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

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

打赏作者

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

抵扣说明:

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

余额充值