чтение / запись дескрипторов сокетов linux c - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь отправить содержимое файла с сервера на клиент, я читаю файл построчно, используя fgets, и пишу в дескриптор сокета построчно, на стороне клиента, я в В то время как цикл, чтение отправленного содержимого. Я не могу завершить последовательность отправки сервером, то есть клиент продолжает читать буфер и следующая строка программы не выполняется, я думаю, что-то не так с моим способом отправки или получения. вот код:

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, имя пира не выполняется до тех пор, пока я не завершу работу сервера)

1 Ответ

2 голосов
/ 31 марта 2012

Мне удалось выяснить это, я отправил содержимое файла с сервера, используя 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 был использован для блокировки сокета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...