0

サーバ:

    public static void getListOfFiles(String path, DataOutputStream outToClient) throws IOException
    {
        // Directory path here
          //String path = "."; 

          String files;
        try 
        {
              File folder = new File(path);
              File[] listOfFiles = folder.listFiles(); 
              String sendOver = "";

              for (int i = 0; i < listOfFiles.length; i++) 
              {


                   files = listOfFiles[i].getAbsolutePath();
                   sendOver = sendOver + "!" + files;


              }
              outToClient.writeBytes(sendOver + "\n");
        } 
        catch (Exception e) 
        {
            outToClient.writeBytes("There was an error with the path, please try again. \n" );
        }

    }

    public static void getDate(DataOutputStream outToClient) throws IOException
    {

        outToClient.writeBytes(Calendar.getInstance().getTime().toString() + '\n');
    }

    public static void getUsers(DataOutputStream outToClient) throws IOException
    {
        outToClient.writeBytes("User logged in: "+ System.getProperty("user.name") + "\n");
    }


}

クライアント:

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>


int main()

{

    int sock, bytes_recieved;
    char send_data[1024],recv_data[1024];
    struct hostent *host;
    struct sockaddr_in server_addr;
    bytes_recieved = 1024;
    host = gethostbyname("localhost");

    sock = socket(AF_INET, SOCK_STREAM,0);

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(3324);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(server_addr.sin_zero),8);

    connect(sock, (struct sockaddr *)&server_addr,sizeof(struct sockaddr));
    char *temp = '\n';

    while(1)
    {
        printf("Enter Command...\n");
        gets(send_data);
        strcat(send_data, "\n");
        send(sock,send_data,strlen(send_data), 0);

        if(send_data[0] == 'Q' && send_data[1] == 'U' && send_data[2] == 'I' && send_data[3] == 'T')
        {
            printf("Quiting...");
            break;
        }


        //printf("\nSend Data :");

        recv_data[bytes_recieved] = '\0';
        bytes_recieved = recv(sock,recv_data,1024,0);
        //fflush(stdin);
        printf("\nRecieved data = %s" , recv_data);
        recv_data[bytes_recieved] = '\0';

    }
}

基本的に、サーバー側はすべてを正しく受け取ります (私はデバッグしました) が、クライアントは正しく読み取っていてはなりません-

クライアント側のコンソールからのいくつかの例を次に示します。

test

Recieved data = Error wEnter Command...**<---- What The??**


Recieved data = ith command: TEST_c.dylibEnter Command... **<---- What The??**


Recieved data = Error with command: dylibEnter Command... **<---- What The??**


Recieved data = Error with command: Enter Command... **<---- What The??**

書き返しています

outToClient.writeBytes("Error with command: " + capitalizedSentence + "\n" );

上記を取得したとき。うまくいけば、誰かがCに精通しています。

4

1 に答える 1

1

1つのバグ(他にもあるかどうかはわかりません):次のようにします。

bytes_recieved = 1024;
char send_data[1024],recv_data[1024]; 
recv_data[bytes_recieved] = '\0'; //  <--- HERE YOU ARE WRITING OUT OF BOUNDS
bytes_recieved = recv(sock,recv_data,1024,0);   

試す:

recv_data[bytes_recieved - 1] = '\0';
bytes_recieved = recv(sock,recv_data,1023,0);   

また、すべてのメッセージの長さが1023バイトでない限り。\0バッファの終わりではなく、文字列の最後にを追加する必要がある場合があります。

最後に、readの使用法についてはマニュアルを参照する必要があります。http://linux.die.net/man/2/recv

使用するフラグを使用していない可能性があります。ここでバッファで利用可能なバイト数を決定する方法を見ることができます:https ://stackoverflow.com/a/3054519/828193

お役に立てば幸いです。

于 2013-02-19T03:17:12.623 に答える