写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互

题干
请你分别写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括:
    pwd:显示服务器应用程序启动时的当前路径。
    cd:改变服务器应用程序的当前路径。
    ls:显示服务器应用程序当前路径下的文件列表。
    quit:客户端进程退出,但是服务器端不能退出,第二个客户可以再次连接上服务器端。
    
客户端程序要求
    1、可以指定待连接的服务器端 IP 地址和端口。
    2、在输入一个命令之后,回车结束,之后等待服务器端将执行结果返回,客户端程序需要将结果显示在屏幕上。
    3、样例输出如下所示。
    
第一次连接服务器
$./telnet-client 127.0.0.1 43211
pwd
/home/vagrant/shared/Code/network/yolanda/build/bin
cd ..
pwd
/home/vagrant/shared/Code/network/yolanda/build
cd ..
pwd
/home/vagrant/shared/Code/network/yolanda
ls
build
chap-11
chap-12
chap-13
chap-14
chap-15
chap-16
chap-17
chap-18
chap-20
chap-21
chap-22
chap-23
chap-25
chap-26
chap-27
chap-28
chap-4
chap-5
chap-6
chap-7
clean.sh
cmake-build-debug
CMakeLists.txt
lib
mid-homework
README.md


cd -
pwd
/home/vagrant/shared/Code/network/yolanda
cd /home
pwd
/home
ls
ubuntu
vagrant
quit

//再次连接服务器
$./telnet-client 127.0.0.1 43211
pwd
/home/vagrant/shared/Code/network/yolanda/build
ls
bin
chap-11
chap-12
chap-13
chap-15
chap-16
chap-17
chap-18
chap-20
chap-21
chap-22
chap-23
chap-25
chap-26
chap-28
chap-4
chap-5
chap-6
chap-7
CMakeCache.txt
CMakeFiles
cmake_install.cmake
lib
Makefile
mid-homework

quit

服务器程序要求
1、暂时不需要考虑多个客户并发连接的情形,只考虑每次服务一个客户连接。
2、要把命令执行的结果返回给已连接的客户端。
3、服务器端不能因为客户端退出就直接退出。

client 端代码:


#include "lib/common.h"

#define MESSAGE_SIZE 102400

// Send and receive data.
void send_data(int sockfd) {
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[32] = "";
 
    bytesSent = send( sockfd, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );
 
    while( bytesRecv == SOCKET_ERROR ) {
        bytesRecv = recv( sockfd, recvbuf, 32, 0 );
        if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
            printf( "Connection Closed.\n");
            break;
        }
        if (bytesRecv < 0)
            return;
        printf( "Bytes Recv: %ld\n", bytesRecv );
    }

    return;
}

int main(int argc, char **argv) {
    // Initialize Winsock.
    int sockfd;
    struct sockaddr_in servaddr;

    //if (argc != 2)
        //error(1, 0, "usage: tcpclient <IPaddress>");
    
    // Create a socket.
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    // Connect to a server.
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(12345);
    servaddr.sin_port = inet_addr("170.1.1.60");
    //inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
    int connect_rt = connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
    if (connect_rt < 0) {
        error(1, errno, "connect failed ");
    }
     // Send and receive data.
    send_data(sockfd);
    exit(0);
}

参考材料:

https://blog.csdn.net/weixin_34161029/article/details/94192444

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值