2013-10-22 54 views
-2

我有這些循環在客戶端服務器模型,但這些循環在客戶端代碼是從文件中讀取,直到文件爲0或EOF,但它永遠不會進入循環,即使條件爲真???奇怪的同時循環在C插座?

int n_read; 

while (( n_read=((read(sockfd,&buffer,sizeof(buffer))))>0 ) ); 
{ 
    printf("test to print\n"); 
    write(fd,buffer,strlen(buffer)); 
    //bzero(&buffer,sizeof(buffer)); 


} 

和奇怪的是,我有同一個循環中服務器代碼讀取和文件 編寫和工作完美,但我不知道爲什麼在客戶端不作爲服務器工作???

這裏是服務器的循環代碼:

while ((read(fd,buffer,sizeof(buffer)))>0) /* to read from open file descriptor */ 
         { 
          n=write(connfd,&buffer,n); 
          if(n<0){error("Error,Reading from socket \n");}  
          {buffer[n] = '\0';} 
         } 

那麼,如何解決這個問題呢?

回答

2

在客戶端代碼的行尾有一個分號。

while (( n_read=((read(sockfd,&buffer,sizeof(buffer))))>0 ) ); 
                    ^

這是考慮整個循環。你不會執行下面的代碼,直到它是假的,然後纔會發生。

你也用括號去了一些堅果。你可以把它縮小到

while ((n_read = read(sockfd, &buffer, sizeof(buffer))) > 0) 
0

建議:永遠不要放一個「;」 (分號)一段時間之後/ for循環擁抱右側paren。您確實需要一種編碼風格,它可以將分號放在自己的行上,或者在每個循環之後放置{}(大括號)。

有些人喜歡擁抱其他方法來避免這個問題。

我更喜歡循環關鍵字下的{}和乾淨)在行尾。

請在兩個程序中顯示緩衝區的聲明。在一個你提供&緩衝區(緩衝區的地址),而在另一個你只提供緩衝區。可能你的緩衝區已經被聲明爲一個指針或數組,因此'&'正在引發問題。

由於插座很高興能進位二進制,你可能希望確保您終止您收到任何CString的,例如,

int n_read; 
while ((n_read=read(sockfd,&buffer,sizeof(buffer))) >0) 
{ 
    buffer[n_read]='\0'; 
    printf("test to print, %s\n",buffer); 
    write(fd,buffer,strlen(buffer)); 
}