Отправка нескольких полезных нагрузок через сокет в Perl - PullRequest
0 голосов
/ 31 января 2012

Редактировать: проблема с IIS, а не с кодом Perl, который я использую. Кто-то еще говорил об этой проблеме здесь: https://stackoverflow.com/a/491445/1179075

Давний читатель здесь, первый раз.

Итак, я работаю над существующим кодом в Perl, который выполняет следующие действия:

  1. Создать сокет
  2. Отправить некоторые данные
  3. Закрыть розетку
  4. Возвращаться к 1, пока не будут отправлены все данные

Чтобы избежать затрат на создание и закрытие сокетов постоянно, я решил сделать это:

  1. Создать сокет
  2. Отправить некоторые данные
  3. Возвращаться к 2, пока не будут отправлены все данные
  4. Закрыть розетку

Дело в том, что отправляется только первая полезная нагрузка - все последующие игнорируются. Я отправляю эти данные в веб-службу .NET, а IIS вообще не получает эти данные. Каким-то образом сокет закрывается, и я понятия не имею, почему.

Вот скрипт, который я использую для проверки моих новых изменений:

use IO::Socket;
my $sock = new IO::Socket::INET(PeerAddr => $hostname, PeerPort => 80, Proto => "tcp", Timeout => "1000") || die "Failure: $! ";
while(1){
    my $sent = $sock->send($basic_http_ping_message);
    print "$sent\n";
    sleep(1);
}
close($sock);

Так что это не работает - IIS получает только самый первый пинг. Однако если я переместлю присвоение $sock и замыкание в цикле, IIS правильно получит каждый пинг.

Я просто неправильно использую сокеты или в IIS есть какие-то непонятные настройки, которые мне нужно изменить?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Какой выход вы получаете? У вас есть отпечаток после send(), если send() не получится, он вернет undef. Вы можете распечатать ошибку как:

     my $sent = $sock->send($msg);
     die "Failed send: $!\n" unless defined $sent;
     print "Sent $sent bytes\n";

Я предполагаю, что служба, к которой вы подключаетесь, закрывает соединение, поэтому только один из них проходит, а также почему создание нового соединения каждый раз будет работать.

0 голосов
/ 31 января 2012

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

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