接受TCP连接的Bash脚本,当发生客户端连接时,将时间作为响应发送给客户端

时间:2017-10-30 08:15:18

标签: bash

我不会撒谎这是一项家庭作业,但我一直在谷歌搜索,试图了解如何处理这个特定的问题。

"创建一个名为lab6s6的脚本,该脚本接受TCP连接。当客户端连接时 发生,发送时间作为对客户的响应。您可以选择任何端口号 听取端口,不要忘记关闭你的连接。"

我在我的虚拟机上运行最新的fedora操作系统

在做了一些研究之后,我发现了这段特殊的代码

  

$ exec {file-descriptor}<>/dev/{protocol}/{host}/{port}

进行一些研究后我想出的是

exec 3<>/dev/TCP/127.0.0.1/8000

因此,根据我的一般理解,文件描述符往往总是设置为3(这是因为stdin,stdout,stderr,这是什么目的?)还&#34;&lt;&gt;&# 34;它代表读写,目录是实际使用这些协议的一种方式。最后,对于我的ip,我读到某个地方,我不应该使用环回来,这不会起作用,但说实话,我在阅读文章时有点无能为力,对于我从未真正理解的端口那就是数字越大,信号越多可用吗?

和另一个问题,我是否需要安装任何其他类型的软件才能完成这样的事情?如果有人能够澄清我是否基本上像我的电脑上的电话线一样开放,以便能够与局域网上的其他电脑通话,那是否可能?

我不是要求直接答案,但如果有人能够朝着正确的方向推动我,我会非常感激!

再次感谢!

1 个答案:

答案 0 :(得分:0)

我已为您准备了两个脚本:客户端和服务器 给他们执行权后: chmod u + x script_name 你可以按任何顺序运行它们(客户端 - &gt;服务器或服务器 - &gt;客户端)

bash_server.sh

#!/usr/bin/env bash

#define port on which the server will listen
#and the output file that will be used to store the client port to send an answer
readonly PORT_LISTEN=22222;
readonly SERVER_FILE=server_file_tmp.out;

echo "Removing the server temporary file: ${SERVER_FILE}";
rm -f "${SERVER_FILE}";
#will open/bind/listen on PORT_LISTEN and whenever some information is received 
#it will write it in the SERVER FILE
echo "Starting the server on port: ${PORT_LISTEN} with configuration file: ${SERVER_FILE}";
nc -k -l "${PORT_LISTEN}" | tee "${SERVER_FILE}" &

echo "Waiting for connection..."
#active listening to entry connection
while true; 
do
    #get always information about the external connection trying to connect to our open port
    tmpNetworkString=$(lsof -i:"${PORT_LISTEN}" | grep "localhost:${PORT_LISTEN} (ESTABLISHED)" | awk '{print $9}');
    echo -n "${tmpNetworkString}";
    if [ -s "${SERVER_FILE}" ] && [ ! -z "${tmpNetworkString}" ]; then
        answerPORT=$(cat "${SERVER_FILE}");
        echo "Connection received on port ${PORT_LISTEN}...";
        incomingIP=$(echo $tmpNetworkString | cut -d':' -f1);
        incomingPort=$(echo $tmpNetworkString | cut -d'-' -f1 | cut -d':' -f2);
        echo ">>Incoming traffic IP: ${incomingIP}";
        echo ">>Incoming traffic Port: ${incomingPort}";
        echo "Answering on IP: ${incomingIP}, port: ${answerPORT}...";
        #wait client port to be ready
        nc -z "${incomingIP}" "${answerPORT}";
        isOpen=$?;
        while [ ! "${isOpen}" -eq 0 ];
        do
            nc -z "${incomingIP}" "${answerPORT}";
            isOpen=$?;
        done
        echo $(date) | nc -q 2 "${incomingIP}" "${answerPORT}";
        echo "Closing the server, port: ${PORT_LISTEN}";
        fuser -k -n tcp "${PORT_LISTEN}";
        echo "Removing the server temporary file: ${SERVER_FILE}";
        rm -f "${SERVER_FILE}";
        exit 0;
    fi
done

bash_client.sh

#!/usr/bin/env bash

#define port on which the client will listen
#and the output file that will be used to store the answer from the server
readonly PORT_LISTEN=33333;
readonly CLIENT_FILE=client_file_tmp.out;
readonly SERVER_PORT=22222;
readonly SERVER_IP=localhost

echo "Removing the client temporary file: ${CLIENT_FILE}";
rm -f "${CLIENT_FILE}";
#will open/bind/listen on PORT_LISTEN and whenever some information is received 
#it will write it in the CLIENT FILE
echo "Starting the server on port: ${PORT_LISTEN} with configuration file: ${CLIENT_FILE}";
nc -k -l "${PORT_LISTEN}" > "${CLIENT_FILE}" &

echo "Connecting to the server: ${SERVER_IP}, on port: ${SERVER_PORT} and waiting for answer";
#sending port information for answer:

#wait client port to be ready
nc -z "${SERVER_IP}" "${SERVER_PORT}";
isOpen=$?;
while [ ! "${isOpen}" -eq 0 ];
do
    nc -z "${SERVER_IP}" "${SERVER_PORT}";
    isOpen=$?;
done
echo "${PORT_LISTEN}" | nc -q 2 "${SERVER_IP}" "${SERVER_PORT}";

while true; 
do
    if [ -s "${CLIENT_FILE}" ]; then
        echo "Answer received from server...";
        echo "##############################";
        echo "##############################";
        cat "${CLIENT_FILE}";
        echo "##############################";
        echo "##############################";
        #sleep 10;
        echo "Closing the open port of the client, port: ${PORT_LISTEN}";
        fuser -k -n tcp "${PORT_LISTEN}";
        echo "Removing the answer file: ${CLIENT_FILE}";
        rm -f "${CLIENT_FILE}";
        exit 0;
    fi
done