在套接字描述符上读/写linux c

问题描述:

我想从服务器发送文件的内容到客户端,我正在逐行读取文件行,使用fgets并逐行写入套接字描述符,客户端,我在一个while循环中,读取发送的内容。我无法终止服务器发送序列,即客户端不断读取缓冲区,下一个程序行不执行,我认为他们有什么问题我发送或接收的方式。这里是代码:在套接字描述符上读/写linux c

server : 
filefd = fopen("clients.txt","a+"); 
      while(fgets(filcont,300,filefd) != NULL) 
      {// write whole file contents to client 
      n=write(newsockfd,filcont,strlen(filcont)); 
      if(n==0) break; 
      memset(filcont,'\0',300); 
      } 
     fclose(filefd); 


client side : 
while(n>0){ 
      n = read(sockfd,buffer,sizeof(buffer)-1); 
      if(n==0) break; 
      printf("%s\nbytes read :%d \n",buffer,n); 
      memset(buffer,'\0',256); 
      } 

的printf( “输入端名称(除你的)发送连接请求:\ n”); 上面的行(printf,peer name不会被执行,直到我终止服务器)

我能弄明白,我使用fread而不是fgets(逐行)从服务器发送文件内容并使用在客户端单个读取()。这是快速修复。 但我也想出了另一种方法,以防万一你必须强制使用fgets,其中客户端的while循环使套接字非阻塞用于读取,然后再次阻塞,代码粘贴在下面。

flags = fcntl(sockfd, F_GETFL, 0); 
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);  
while(n>0){ 
      n = read(sockfd,buffer,sizeof(buffer)-1); 
      if(n==0) break; 
      if(n==-1) printf("\nNon blocking read failed congrats"); 
      printf("%s\n",buffer); 
      memset(buffer,'\0',256); 
      } 
      printf("\nbytes read :%d \n",n); 
      val = fcntl(sockfd, F_GETFL, 0); 
      flags = O_NONBLOCK; 
      val &= ~flags; // makes it blocking again 
      fcntl(sockfd,F_SETFL,val); 

从计算器代码为参照,使插座阻塞