2013-02-19 82 views
0

服务器:Ç - 客户端/ JAVA - 服务器 - 客户端阅读奇怪的事情

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

一个错误(不知道的是,有更多): 你这样做:

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,而不是缓冲区的末尾。

最后,你应该看一下阅读使用手册。 http://linux.die.net/man/2/recv

有可能您没有使用您打算使用的标志。你可以看到一种确定缓冲区中可用字节数的方法:https://stackoverflow.com/a/3054519/828193

希望有帮助。

+0

你是对的,这是一个错误。然而,它并没有解决这个问题..我看看ioctl(...);看起来如果我按两次Enter键,第二次读取就会得到正确的结果 – Aziz 2013-02-19 21:46:09