Отправка сообщения серверу и дожидание ответа от него.

Тема в разделе "WASM.NETWORKS", создана пользователем XshStasX, 2 дек 2008.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    как получить ответ от сервера, поли писилки ему команди через функ. send
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Ээ... а протокол какой? Если свой, то пришли себе "OK", а на клиенте сделай recv().
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    протокол, SMTP пожет бить еще POP3
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А можна показать пример отправки и приема даних серверу? к примеру по протоколу смтп
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    а то у меня что, нет ответа(прога просто сидит и ждет будет ли ей ответ и все....а рузультата за минуту никакого, хотя конект прошол хорошо
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    вот пример кода, мож я что то тут не правильно делаю(за дельфи просьба не ругать!)
    var
    host:string;
    s:string;
    begin

    if bool(WSAStartup(MakeWord(2,0),wsa)) then MessageBox(0,'error','',0);
    {host:=''; }
    host:='194.67.23.111';
    FillChar(addr,SizeOf(addr),0);
    addr.sin_family:=AF_INET;
    addr.sin_addr.S_addr:=inet_addr(Pchar(host));
    addr.sin_port:=htons(2525);
    Fsock:=socket(AF_INET,SOCK_STREAM,0);
    if (Fsock=INVALID_SOCKET) then
    MessageBox(0,'INVALID_SOCKET','Socket',0);
    Writeln('CreateSocket');
    Fsock:=socket(AF_INET,SOCK_STREAM,0);
    if connect(Fsock,@addr,SizeOf(addr))=SOCKET_ERROR then MessageBox(0,'SOCKET_ERROR','Connect',0)
    else
    begin
    Writeln('Connect is good');
    s:='EHLO ';
    send(FSock,S,Length(s),MSG_PEEK);
    Writeln('SendData');
    s:='';
    recv(Fsock,S,255,MSG_OOB);
    Writeln('Recv');
    closesocket(Fsock);
    MessageBox(0,'SocketClose',Pchar(s),0);
    end;
    {if send(FSock,host,length(host),MSG_OOB )=SOCKET_ERROR then MessageBox(0,'error','SendSocket',0); }

    {if closesocket(Fsock)=SOCKET_ERROR then MessageBox(0,'error','CloseSocket',0); }

    end.
     
  7. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Так я то и делаю!!!
    но чегото переменная s, пустая а она по идее как минимум должна содержать текст типа неправильная команда
     
  9. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    1) send() вызывать вот так:
    send(m_socket, sData.c_str(), sData.size(), 0);

    2) recv() вот так:
    int size = recv(m_socket, (char *)buff, buffSize, 0);

    3) проверяй значение которое эти ф-ции возвращают
     
  10. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    дайте наверно пример с получение и отправкой команду серверу по протоколу смтп, а то у меня не чего толком не виходит...прога сидит и ждет и все а потом в переменную не чего не записывает(((
     
  11. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Ёлки, исправь три вещи которые я упомянул.
     
  12. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    XshStasX
    Ти рюсский гидэ учылъ?

    короче смысл: Ты ему строку - он тебе строку. Всё.
    Вернее, не так: Если SMTP, то Он тебе строку - ты ему строку. Не забывай про \r\n
     
  13. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    нее. Стринги тут не уместны.
    ----------------------------------------------------
     
  14. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    у меня даные отправляются, но вот делал на у себя тестовой сервер(127,0,0,1) так когда это сервер принимает дание то в них какойто бред, также когда сервер отсылает дание обратно моей проге она тож получает не известно(пустая строка) что,зато функция приема даних от сервера возвращает значение которое равняется количеству байт которые отправил сервер.(в качестве типа строки пробывал такие типы LPSTR,PWideChar,Pchar,string.
    что я не так делаю?
    var
    host:pchar;
    s:Pchar;
    sh:pchar;
    count:Cardinal;
    begin
    if bool(WSAStartup(MakeWord(2,0),wsa)) then MessageBox(0,'error','',0);
    host:=Pchar(GetMemory(256));
    host:='194.67.23.111';
    FillChar(addr,SizeOf(addr),0);
    addr.sin_family:=AF_INET;
    addr.sin_addr.S_addr:=inet_addr(Pchar(host));
    addr.sin_port:=htons(2525);
    Fsock:=socket(AF_INET,SOCK_STREAM,0);
    if (Fsock=INVALID_SOCKET) then
    MessageBox(0,'INVALID_SOCKET','Socket',0);
    Writeln('CreateSocket');
    Fsock:=socket(AF_INET,SOCK_STREAM,0);
    if connect(Fsock,@addr,SizeOf(addr))=SOCKET_ERROR then MessageBox(0,'SOCKET_ERROR','Connect',0)
    else
    begin
    Writeln('Connect is good');
    s:='HELLO'#13#10;
    count:= send(FSock,Pchar(S),Length(s),0);
    Writeln('SendByte:',count);
    s:='';
    sh:='fjghjgfj';
    sh:=PChar(GetMemory(256));
    count:= recv(Fsock,sh,length(sh),0);
    writeln('GetByte:',count);
    Writeln('Recv:',sh);
    closesocket(Fsock);

    MessageBox(0,'SocketClose',Pchar(s),0);
    readln;
    end;
    end.
     
  15. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    1) Fsock:=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

    2) убери второй вызов

    3) после connect() дождись сообщения от сервера - должен получить "220 smtp.example.com ESMTP Postfix some data here"

    4) потом делай send()

    5) потом ещё один recv()
     
  16. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Не виходить....
    Можете показ пример отправки и приема команды на сервер, на асме???
     
  17. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    XshStasX
    какая разница паскаль/асм/Це? асм тебе погоду не сделает, разобрался с паскалём бы сначала, но если не имётся http://www.wasm.ru/article.php?article=1016002 и к почте коннектятся на 25, а НЕ 2525 (!) порт, если что.

    З. Ы!
    [Exp10der@localhost ~]$ telnet 194.67.23.111 2525
    Trying 194.67.23.111...
    telnet: connect to address 194.67.23.111: Connection refused
    [Exp10der@localhost ~]$ telnet 194.67.23.111 25
    Trying 194.67.23.111...
    Connected to 194.67.23.111.
    Escape character is '^]'.
    220 mail.ru ESMTP Fri, 05 Dec 2008 21:00:07 +0300
    что и требовалось доказать.
     
  18. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    на маил ру иногда 2525 или 25 или еще есть 877(если не ошибаюсь)
    посмотри инфу о настройке почти на маил ру.
    и с паскалем я то разобрался...а прошу на асме ...так как помнится на васме очень не нравился дельфийский код!
    да и на дельфи фроде все правильно зделал....но что то ответ то есть, но там полний бред!!!
    написано что я получил 6 байт (к примеру) а символов токо 3, и такое чуство что это просто мусор в памяти программы
     
  19. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    IPPROTO_TCP в коннекте указал последним параметром? recv после коннекта добавил? да и sh у тебя указатель на буффер, а не сам буффер вот и возвращает чёрти что - замени на sh^ (или ^sh точно не помню), или вообще..
    var buf: array [0..$FF] of char;
    ..
    recv(fsock, buf, $100, 0); // в дельфе тут сам буффер указывается, а не указатель на него

    плохо разобрался, нельзя путать данные и указатели.

    это дело вкуса, я лично масм и дельфю с асм вставочками предпочитаю, хотя кому как, но Це я не переношу просто физически.