【问题标题】:read / write on socket descriptors linux c读/写套接字描述符linux c
【发布时间】:2012-04-13 15:08:15
【问题描述】:

我正在尝试将文件的内容从服务器发送到客户端,我正在使用 fgets 逐行读取文件并逐行写入套接字描述符,在客户端,我在一个while 循环,读取发送的内容。我无法终止服务器发送序列,即客户端继续读取缓冲区并且下一个程序行没有执行,我认为我的发送或接收方式有问题。这是代码:

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 ,在我终止服务器之前不会执行对等名称)

【问题讨论】:

    标签: sockets client


    【解决方案1】:

    我能够弄清楚,我使用 fread 而不是 fgets(逐行)从服务器发送文件内容,并在客户端使用了单个 read()。这是快速修复。 但是我还想出了另一种技术,以防您必须强制使用 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);
    

    引用了stackoverflow的代码来使套接字阻塞

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2012-10-29
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多