2011-12-20 56 views
-1

在客戶端 - 服務器編程中工作時,我在客戶端傳遞了3個字符串,它將被服務器接收,並且應該在那裏打印3次。 (即我已經使用'for'循環,它將分別在客戶端&中執行讀取&寫入操作),但是在服務器中,只有第一個字符串正在打印。爲什麼我無法讀取服務器文件中的多個字符串?

請解釋一下,

這裏是我的代碼

server.c

#include "head.h" 

void readstr(int connfd ,char [][20]); 
//void writestr(char * ,int); 

int main(int c ,char *v[]) 
{ 
     int  sd,connfd,retbind; 
     struct sockaddr_in serveraddress ,cliaddr; 
     socklen_t len; 
     char buf[100] ,databuf[1024][4]; 
     sd =socket(AF_INET ,SOCK_STREAM ,0); 
     if (sd<0) 
     { 

       exit(1); 
     } 
     memset(&serveraddress ,0 ,sizeof(serveraddress)); 
     serveraddress.sin_family =AF_INET; 
     serveraddress.sin_port =htons(MYPORT); 
     serveraddress.sin_addr.s_addr =htonl(INADDR_ANY); 
     retbind =bind(sd ,(struct sockaddr*)&serveraddress ,sizeof(serveraddress 
)); 
     if(-1 ==retbind) 
     { 
       perror("bind fails "); 
       exit(0); 
     } 
     listen(sd ,4); 
     for(;;) 
     { 
     printf("i am waiting for client\n"); 
     len =sizeof(cliaddr); 
     connfd = accept(sd ,(struct sockaddr*)&cliaddr ,&len); 
     if(connfd <0) 
     { 
     if(errno ==EINTR) 
     printf("interrupt"); 
     continue; 
     } 
     printf("connection from %s\n",inet_ntop(AF_INET ,&cliaddr.sin_addr,buf , 
sizeof(buf))); 
     readstr(connfd ,databuf); 
     close(connfd); 
     printf("\n fini one clieni"); 
     } 
     return 0; 
} 

void readstr(int connfd ,char str[3] [20]) 
{ 
     int pointer=0 ,i=0, n,pos=0; 
     memset(str ,'\0',sizeof(str)); 
     printf("\n->Connfd : %d\n",connfd); 
     printf("\n----->String recieved : %s\n",str); 
     for(i=0;i<3;i++) 
     { 
     while((n=read(connfd ,str[i] ,20)) >>0) 
     { 
       printf("Looping while\n"); 
       pos =pos +n; 

     } 
     str[i][pos] ='\0'; 
     } 
     for(i=0;i<3;i++) 
     { 
       printf("\n%s",str[i]); 
     } 
} 

client.c

#include "head.h" 
void send1(int ,char*); 

int main(int c,char*v[]) 
{ 
     int sd,i; 
     int len; 
     char buf[20][4]; 
     struct sockaddr_in serveraddress; 
     sd = socket(AF_INET ,SOCK_STREAM ,0); 
     if (sd<0) 
     perror("socket"); 
     memset(&serveraddress ,0 ,sizeof(serveraddress)); 
     serveraddress.sin_family =AF_INET; 
     serveraddress.sin_port =htons(atoi(v[1])); 
     serveraddress.sin_addr.s_addr =inet_addr(v[2]); 

     if(connect(sd,(struct sockaddr*)&serveraddress ,sizeof(serveraddress)) < 
0) 

     { 
       printf("cannot connect to server"); 
       exit(1); 
     } 
     for(i=0;i<3;i++) 
     { 
       memset(buf ,'\0',sizeof(buf)); 
       printf("\n string"); 
       fgets(buf[i],20,stdin); 
       len =strlen(buf[i]); 
       if(buf[i][len] =='\n') 
        buf[i][len]='\0'; 

     //  scanf("%s",buf[i]); 
       send1(sd ,(char *)buf); 
     } 
     shutdown(sd ,SHUT_WR); 
} 

void send1(int sd ,char *str) 
{ 

     int n ,byteswritten =0, wr; 
     char buf[1024]; 
     strcpy(buf ,str); 
     n =strlen(buf); 
     while(byteswritten < n) 
     { 
     printf("\nStart writing in client side\n"); 
     wr = write(sd , buf+byteswritten ,(n-byteswritten)); 
     byteswritten+=wr; 
     } 
     printf("\n string sent %s" ,buf); 

} 

回答

1

在client.c主:

char buf[20][4]; 

變化:

char buf[4][20]; 

在server.c readstr:

while((n=read(connfd ,str[i] ,20)) >>0) 

變化:

while((n = read(connfd, &str[i][pos], 20)) > 0) 

pos需要被複位爲0的for內部循環。

此外,客戶端從標準輸入讀取每個高達20個字符的3個字符串並將它們寫入套接字。 服務器需要3個字符串,每個字符串恰好爲20個字符。

您應該在網絡協議中使用某種類型的記錄分隔符,如\ n,或使用固定長度,即將輸入字符串填充爲20個字符。

你的代碼中可能會有更多的錯誤,我找不到這些錯誤。

0

它已超過1個小時,所以你還沒有得到答案..看起來像一個非常簡單的問題(奇怪的壯舉)。你知道爲什麼?

  • 因爲它非常痛苦地通過你的代碼。

    • 記錄它!
    • 把它分成模塊 - init_net(),form_pkt(), send_pkt(),出口(),..等等
  • 正確描述你的問題。

    • 你有多少客戶正在運行?
    • 僅在打印第一個字符串後會發生什麼情況。你代碼停止,永遠循環什麼?
    • 讓你通過像tcpdump的,Wireshark的數據包捕獲工具看,等
  • 之前,我得到的主要問題。我看到的東西像「DATABUF [1024] [4]」被傳遞到一個帶形式參數「char str [3] [20]」的函數readstr()。

    • 夫婦建議
      • 的運行代碼,通過靜態分析工具來尋找基本的警告。
      • 字符串不是一個偉大的想法在網絡上發送,學習如何定義與報頭和數據部分的數據包結構等
      • 也相信你正在尋找像基礎的通信,而不是流的數據包。瞭解差異!

我不知道這個問題的答案,除非你正確地呈現它。這次和下一次。

相關問題