채팅 클라이언트 서버 모델에 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
}

다시 말하지만, 여기에는 버그가 포함되어 있습니다. mip값을 할당 ip한 다음 명령을 실행하려고 시도합니다 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 전용 function키워드를 제거했습니다. 여기에는 여전히 일부 Bashism이 있지만 POSIX 이식 가능한 스크립트로 쉽게 리팩토링될 수 있습니다.

답변2

nc버퍼링되지 않은 호출로 다음 두 호출을 래핑합니다 sed.

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

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

관련 정보