Почему это многократно печатает перевод строки? - PullRequest
1 голос
/ 16 марта 2012
Сокет

из программы c отправляет 3 числа в сокет в Python. код и вывод ниже:

код сервера Python:

import SocketServer
import threading
import select
import sys

class TCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        self.data = self.rfile.readline()
        print "%s wrote:" % self.client_address[0]
        print (self.data)
        self.request.send(str(long(self.data)+1000))
        cur_connex.append({'ip': self.client_address, 'range': [long(self.data), long(self.data)+10000]})

        for a in cur_connex:
            print("%s did %d - %d on thread %s" % (a['ip'], a['range'][0], a['range'][1], threading.current_thread().name))

        while True:
            select.select([self.rfile], [], [])
            self.data = self.request.recv(10) #also tried "self.data = self.rfile.readline().strip("\n")" and without "strip()"
            print self.data


if __name__ == "__main__":
    HOST, PORT = "", 50001
    cur_connex = []
    done_up_to = 0

    # Create the server, binding to localhost on port 50001
    server = SocketServer.TCPServer((HOST, PORT), TCPHandler)

    # Activate the server on new thread
    listen_thread = threading.Thread(target=server.serve_forever, name='listen_th')
    listen_thread.start()

код клиента c ++:

for(unsigned long long i; i < perfect_numbers.size(); i++)
{
    cout << "i is " << i << " writing " << perfect_numbers[i] << "\n";

    for(int j = 0; j < perfect_numbers[i].size(); j++)
    {
        cout << perfect_numbers[i][j] << "|";
    }

    if(write(sock, perfect_numbers[i].c_str(), sizeof(perfect_numbers[i].c_str())) == -1)
    {
        cerr << "\nwrite failed: " << strerror(errno) << "\n";
        return -1;
    }
}

if(close(sock) == -1)
{
    cerr << "close sock error: " << strerror(errno) << "\n";
    return -1;
}

cout << "exiting...\n";
return 1;

вывод сервера:

>>> 127.0.0.1 wrote:
12695

('127.0.0.1', 55624) did 12695 - 22695 on thread listen_th
28
496
8128

... а затем непрерывные переводы строк

вывод клиента:

that took 1.26624 seconds
i is 0 writing 28

2|8|
|i is 1 writing 496

4|9|6|
|i is 2 writing 8128

8|1|2|8|
|exiting...

Я предполагаю, что последний бит клиентской программы C ++ достаточно. Также предполагается, что это что-то в этом цикле while True на сервере. Я плохо знаком с обоими этими языками, я знаю, что мое кодирование еще не очень хорошее, будьте осторожны ...

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

этот пост обрабатывает немного больше, чем запрашивал OP, прошу прощения за это.Если вас интересует только то, как исправить ожидающие новые строки, написанные на сервере, перейдите в раздел " python ".


Оба клиента/ server

  • Вы должны добавить разделитель между числами, отправленными / полученными, ничто не гарантирует, что каждый номер прибудет индивидуально.Вы можете получить два номера в одном звонке, к которому добавится self.request.recv (...).

python

  • print добавитсясимвол новой строки ('\n') для каждого переданного ему оператора, если только вы не завершаете оператор print запятой.

  • Вы должны добавить проверку, чтобы увидеть, действительно ли она быладанные для чтения, если не было, возможно, произошла ошибка или соединение было закрыто.

    while True:
        select.select([self.rfile], [], [self.rfile])
        self.data = self.request.recv(10) 
        if self.data:
           print self.data
        else:
           # <close connection here>
    

c ++

write(sock, perfect_numbers[i].c_str(), sizeof(perfect_numbers[i].c_str()))
  • Выше всегда будет пытаться записать sizeof(char*) символов в сокет sock, независимо от того, имеет ли perfect_numbers[i] длину один или миллиард байтов.

    третьим аргументом write должно быть количество байтов, которые вы хотите записать, поэтому вы должны использовать perfect_numbers[i].size (). 1


1 Я предполагаю, что вы были сбиты с толку, когда рассматривали такие примеры, как:

 char buf[1024];

 ...

 write (sock, buf, sizeof (buf));
1 голос
/ 16 марта 2012

Глядя на вывод

я 0 пишу 28

2 | 8 * | | * я ...

Я предполагаю, что perfect_numbers [i] заканчивается на \ n (в данном случае «28 \ n»). Как генерируется список?

1 голос
/ 16 марта 2012

Для обработчиков потоковых запросов self.request - это объект socket.Функция socket.recv возвращает пустую строку, когда сокет закрыт.

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