URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2256
[ Назад ]

Исходное сообщение
"send и recv в одном сокете"

Отправлено tang0 , 06-Ноя-03 16:48 
Ув. товарищи люди. Имею следующую проблему:
клиент подключается к серверу к порту 39380 по tcp/ip и передает пакеты
вида: размер данных(4 байта)/код команды(4 байта)/идентификатор(4 байта)/данные(n байт)
сразу же после передачи сервер передает ответ вида:
размер данных(4 байта)/код команды(4 байта)/идентификатор(4 байта)/код ошибки(4 байта)

я пишу следующее:

#! /usr/bin/perl

use Socket;

$host="192.168.0.7";
$port="39380";
$nlength="\x0C\x00\x00\x00";
$ndatalength="\x0C\x00\x00\x00";
$ncommandid="\x06\x00\x08\x07";
$ntransactionid="\x01\x00\x00\x00";

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));


$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);


connect(SOCK, $paddr);

send (SOCK,$nlength.$ndatalength.$ncommandid.$ntransactionid,0);

$nlength="\x10\x00\x00\x00";
$ndatalength="\x10\x00\x00\x00";

recv(SOCK,$nlength.$ndatalength.$ncommandid.$ntransactionid.$errcode,$nlength,0);

print $errcode."\n";

close(SOCK);


пакет, посылаемый на сервер доходит удачно и сервер корректно генерит ответ,
но вместо него я получаю пустые строки. =(
Где может быть ошибка?


Содержание

Сообщения в этом обсуждении
"send и recv в одном сокете"
Отправлено devnull , 07-Ноя-03 21:05 
честно говоря тяжело вьезжать вечером в твои строки. может ты где-то малюсенькую ошибочку сделал.

я когда-то пакетики сам делал с Net::RawIP, там ошибиться сложно. Cмотри сам:
#!/usr/bin/perl -w
use strict;
use Net::RawIP;
my $packet = new Net::RawIP;
$packet->set({
              ip => { saddr => '10.80.2.1',
                      daddr => '10.80.2.1'
                    },
              tcp => { source => 2323,
                       dest => 23,
                       ack => 1,
                       seq => 10000000,
                       ack_seq => 10000000,
                       data => 'Pavel Prostine'
                      }
             });
$packet->send(0,1);

и ты там можешь (почти) что угодно колдовать. В вышеназванном примере высылается например пакет с фальшивым адресом источника.