c - 客户端/ java - 服务器 - 客户端读取奇怪的东西

时间:2013-02-19 02:38:56

标签: java c networking tcp

服务器:

    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语言。

1 个答案:

答案 0 :(得分: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

希望有所帮助。