Как отправить содержимое текстового файла с сервера на клиент через сокеты? - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над заданием, которое позволит серверу захватить содержимое текстового файла с помощью перенаправления ввода-вывода и построчно отправлять клиенту, который я затем вставлю в вектор. Я попытался использовать цикл while с обеих сторон, но он не работает. Он читает только первую строку файла (что я делал отдельно, чтобы сначала получить размер) и все. Может кто-нибудь, пожалуйста, посоветуйте мне, как решить эту проблему?

Вот мой код сервера:

listen(sockfd,5);
 clilen = sizeof(cli_addr);
 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);

 if (newsockfd < 0){ 
      error("ERROR on accept");
 }
 bzero(buffer,256);
 n = read(newsockfd,buffer,255);

 if (n < 0){
     error("ERROR reading from socket");
 }

 printf("Here is the message: %s\n",buffer);
 std::getline(std::cin, getFile); // I/O Redirection
 n = write(newsockfd,getFile.c_str(),18); //grabs first line of the file which is 3 and sends it to the client

 while (std::getline(std::cin, getFile)) { 
     n = write(newsockfd, getFile.c_str(), 18); //supposed to write every line of the file to the client but isn't working? Should send 0 1 0 0 1 0 1 -1
     if (n < 0){
         error("ERROR writing to socket");
     }
 }

Код моего клиента:

std::vector<int> input;

printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));

if (n < 0) {
    error("ERROR writing to socket");
}

printf("The ring size is: ");
bzero(buffer,256);
n = read(sockfd,buffer,255); //received first line from server
size = std::atoi(buffer); //ring size converted from char* to int

while (read(sockfd, buffer, 255) > 0) {
    input.push_back(std::atoi(buffer));
    printf("Input contents: %s\n", buffer); //should print 0 1 0 0 1 0 1 -1
}

Мой текстовый файл:

3
0
1
0
0
1
0
1
-1

1 Ответ

0 голосов
/ 01 ноября 2018

TCP - это протокол, основанный на потоках, а не на сообщениях. Это означает, что вам нужно установить протокол, который разделяет отдельные сообщения, если они предназначены для обработки как отдельных сообщений. read(sockfd, buffer, 255) может легко прочитать 255 байт данных из сокета, который содержит несколько сообщений, возможно, даже целый файл, но программа обрабатывает его только как одно сообщение.

Этот ответ содержит относительно простой протокол для отправки строк через сокет

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