如何使用 netcat (nc) 进行聊天客户端服务器模型?

如何使用 netcat (nc) 进行聊天客户端服务器模型?

我正在尝试使用 编写一个守护进程bash。我将输入我合作伙伴的 IP 地址,连接将开始使用nc partner_ip 2015,同样在服务器上我将使用 开始连接nc -l -p 2015

我想在每次发送消息时打印我的名字,并在我的伴侣的消息之前打印他的名字。因此,首先我需要计算出我合作伙伴的用户名和 IP 地址。

#! /bin/bash

function readPip()
{
    echo "Enter your partener IP"
    read ip
    export PIP= $ip
}


function readMip()
{
    mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
    echo -n "'my IP is"$mip"
    export MIP=$mip
}

function chat()
{
    [[ $PIP != " " ]]&& nc $PIP 2015
    [[ $PIP == " " ]] && nc -l -p 2015
}
function testConnect()
{
    nc $PIP 2015  > /dev/null
    echo "am here"
    return $1
}

readPip
testConnect
readMip
echo "$1"

答案1

function readPip()
{
echo "Enter your partener IP"
read ip
export PIP= $ip
}

等号后面的空格是语法错误。但除此之外,所有这些都可以重构为

readPip () {
    read -p "Enter your partner's IP: " PIP
}

export是不必要的,因为您不需要外部子进程来访问此变量。

function readMip()
{
mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
echo -n "'my IP is"$mip"
export MIP=$mip
}

同样,这包含一个错误;您分配给mipip,然后(尝试)运行命令addr list ...,显然其意图是运行ip addr list ...并将结果分配给MIP

readMip () {
    ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1`
}

在这里,我只是将分配留给调用者(readPip可以以相同的方式重构以保持一致性)。

在主代码中,你会有

MIP=$(readMip)

同样,这export既没有必要也没有用。

function chat()
{
[[ $PIP != " " ]]&& nc $PIP 2015
[[ $PIP == " " ]] && nc -l -p 2015
}

这显然是“if - then - else”,应该相应地写。

chat () {
    if [[ "$PIP" == " " ]]; then
        nc -l -p 2015
    else
        nc "$PIP" 2015
    fi
}

甚至

[[ "$PIP" == " " ]] && nc -l -p 2015 || nc "$PIP" 2015

另请注意,我删除了 Bash-onlyfunction关键字。这里仍然有一些 Bashism,但这些可以轻松地重构为 POSIX 可移植脚本。

答案2

nc用无缓冲的调用包装这两个调用sed

sed -u "s/^/My name: /" | nc PARTNER_IP 2015

sed -u "s/^/Partner name: /" | nc -l 2015

相关内容