簡體   English   中英

帶有重定向輸出應用程序的Linux C TCP Socket客戶端/服務器

[英]Linux C TCP Socket client/server with redirected output application

首先讓我說這是一個操作系統類的作業,我不是程序員,特別是不在C中。我已經在這一周了,我只是陷入困境,我需要幫助。 我必須創建TCP客戶端和服務器應用程序,其中linux命令被輸入到客戶端,在服務器上執行,輸出被重定向回客戶端。 我理解這個概念,我有90 +%的工作。 像“ls”,“ls -lpq”,“cat somefile”,“man somecommand”這樣的命令都可以正常工作。 我遇到麻煩的地方是命令沒有返回任何信息,如“mkdir newdir”(如果目錄已經存在,它工作正常,因為我收到了響應)。 這對我來說都是新的,但在我看來,我的問題是服務器recv命令阻塞,因為沒有信息要接收。 我不知道如何解決這個問題,我已經在這個問題上工作了一個星期。 我已經沒時間了,我還必須實現文件上傳和下載,我不知道從哪里開始,但在我遇到這個問題之前我甚至無法開始工作。

謝謝

    // this is where I think the problem is
    while ((rcvd_bytes = recv(sock_fd, recv_str, sizeof(recv_str), 0)) > 0 ) {
        // Zero out the inputCopy buffer
        memset(&inputCopy, 0, sizeof(inputCopy)+1);

        // Copy the recv_str into a new string so that
        // we can work with it.
        strcpy(inputCopy, recv_str);

        argcount = parsecommand(inputCopy, args);

        //Send the message back to client
        dup2(sock_fd, 1);

        if((status = forkAndExecute(args)) != 0) {
            //printf("Command %s returned %d.\n", args[0], status);
        }

            // as a test is I uncomment the following line mkdir newdir
            // returns but the following commands are messed up - as I expect.
        //printf("\n");

        memset(&recv_str, 0, sizeof(recv_str)+1);
        fflush(stdout);
    }  

    if(rcvd_bytes == 0) {
    puts("Client disconnected");
    fflush(stdout);
    }
    else if(rcvd_bytes == -1) {
    perror("recv failed");
    exit(0);
    }

聽起來你需要使用select

if(select(fdmax+1, &my_fdset, 0, 0, NULL) > 0) // there is data available to be read
    recv(...)

其中fdmax是最大的文件描述符(select想要+1), my_fdset是一個文件描述符集,你可以使用FD_SET(sockfd, &my_fdset);添加文件描述符FD_SET(sockfd, &my_fdset);

只有在有可用數據時才會收到此信息。 希望有所幫助。

編輯:

當我編寫一個簡單的客戶端/服務器程序來通過TCP套接字發送/ recv字符串時,我問了一個類似的問題。 我張貼,我結束了使用該線程的代碼在這里 我的不同之處在於我想要一個程序發送和接收,但是如果你查看我的發送者或接收者功能,你可能能夠調整一些東西以使你的程序做你想做的事。

鑒於您的問題描述,我的懷疑是客戶端代碼而不是服務器代碼 - 或者實際上,您在兩者之間隱式創建的協議。

看起來你只是通過使用dup2指向套接字的標准輸出,直接將命令的輸出發送回客戶端。 據推測,客戶端然后從套接字讀取以獲取命令的輸出? 當客戶端向服務器發送命令然后沒有回復時,客戶端做了什么? mkdir這樣的命令不會發回任何內容。 它是否永遠等待服務器發送命令輸出?

通常,對於同步客戶端/服務器協議(客戶端發送命令並且服務器在客戶端發送另一個命令之前發送響應),您必須同意客戶端和服務器之間的協議以清楚地指示何時服務器完成后發送數據,客戶端應發送下一個命令。 您可能需要為服務器添加一些方法來告訴客戶端命令已完成但未發送輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM