Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает отправка данных в сокете.

51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
Цитата:
program test;


uses
crt, sockets;

Var
Sock, Sock_new: LongInt;
SAddr: TInetSockAddr;
buf: ^Word;
Sx: String;
S: ^String;
Ln: Integer;
SAddrLength: LongWord;

Received, i: Integer;
Buffer: array[0..5000] of Byte;
Ss: String;
Begin
ClrScr;
Sock := fpsocket(AF_INET, SOCK_STREAM, 0);
If (Sock = -1) then begin
Writeln('Socket Error');
ReadLn;
Halt;
end else
writeln ('Socket created - OK');

SAddr.sin_family := AF_INET;
SAddr.sin_Port := htons(1234);
SAddr.sin_addr := StrToNetAddr('127.0.0.1');

New(buf);
buf^ := 26;

If (fpconnect(Sock,@SAddr,SizeOf(SAddr)) <> -1) then begin
WriteLn('Connect - OK');

for i := 1 to 50 do begin
Sx := 'test'MESSAGE KEY MISSING: '13'10#11;
Received := fpsend(Sock,@Sx,Length(Sx),1);
WriteLn(Received);
end;

repeat
Received := fpRecv(Sock, @Buffer[0], 5000, 0);
if Received < 0 then
WriteLn('[done]');
SS := '';
for i := 0 to Received-1 do SS := SS + chr(Buffer);
Write(SS);
until Received <= 0;
end else begin
WriteLn('Connect - Error');
end;
fpShutDown(Sock, 2);
CloseSocket(Sock);
WriteLn('Socket closed, press Enter.');
ReadLn;
Halt;
End.



Собственно вот код.. Создаю сокет, подключаюсь нормально, данные приходят нормально, но сервер их не принимает. Через telnet и netcat проверил - всё отлично. Сервер принял данные, а через fpsend нет.

Что я делаю не так? (:

ЗЫ: fpc компилятор. кроссплатформенный код под Linux/Windows. Не работает одинакого везде)

278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
Вы ведь используете TCP, а не UDP. Следовательно, чтобы заставить сервер чего-то принять, нужно вызвать listen() и accept(), а вы этого не делаете. Клиентская часть у вас правильная, а серверная - нет.
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
Здесь только клиент. Сервер написан на C++. Клиенту не нужно listen и accept
278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
[QUOTE=Vidog]
 
Код:
repeat
Received := fpRecv(Sock, @Buffer[0], 5000, 0);
if Received < 0 then
WriteLn('[done]');
SS := '';
for i := 0 to Received-1 do SS := SS + chr(Buffer);
Write(SS);
until Received <= 0;

[/QUOTE]
А вот это тогда что, если не серверная часть?

P.S. Я повторюсь, в клиентской части ошибок нет. Сниффером смотрели, что отправляется?
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
Это считывание данных с сервера.

Сниффером не смотрел. Здесь нет серверной части. Только клиент, который подсоединяется, отправляет данные и бесконечно слушает сервер. Проблема в том, что данные не уходят.
И еще раз повторюсь, что через telnet и netcat данные сервер отлично принимает.
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
'31.186.97.226:722'
если не верите :) Попробуйте через telnet отправить данные и через fpsend(
278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Vidog
Это считывание данных с сервера.


Я прошу прощения, это меня переклинило насчет сервера. :) Сейчас попробуем.

51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
[1316873570] {*****:29236 # @} -- {Connected}
[1316873574] {*****:29236 # @} -- abcd
[1316873577] {*****:29236 # @} -- abcdefg
[1316873581] {*****:29236 # @} -- 123
[1316873581] {*****:29236 # @} -- 12345
[1316873583] {*****:29236 # @} --
[1316873584] {*****:29236 # @} -- QDF
[1316873590] {*****:29236 # @} -- {Disconnected}
ip скрыл в целях безопасности )

Это, видимо, через Telnet?

[1316873838] {*****:58273 # @} -- {Connected}
[1316873845] {*****:58273 # @} -- {Disconnected}

Потому что дальше следовало это ) Данные не ушли, но соединение было успешным.
278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
Да, это через telnet.
278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
А можете сервер показать? Есть у меня пару соображений по этому поводу.
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
Вообще, там тонна кода, но вот куски, думаю что это важно:
http://habrahabr.ru/blogs/cpp/129013/

(:
278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
Проверьте сейчас ваш лог еще раз. Вот мой код (правда, на C, но не суть):

Код:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

int main() {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    SOCKET S = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sockaddr_in srvAddr = {0};
    char buf[1024] = {0};

    srvAddr.sin_family = AF_INET;
    srvAddr.sin_addr.s_addr = inet_addr("31.186.97.226");
    srvAddr.sin_port = htons(722);

    if (connect(S, (const sockaddr *)&srvAddr, sizeof(sockaddr_in)) != 0) {
        printf("%s\n", "Failed to connect!");
        return 1;
    }

    send(S, "12345\r\n", 7, 0);
    send(S, "89012\r\n", 7, 0);

    while (recv(S, buf, 1024, 0)) {
        printf("%s", buf);
        ZeroMemory(buf, 1024);
    }

    closesocket(S);
    WSACleanup();

    return 0;
}

Получил тот же эффект, что и от телнета.
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
[1316873969] {*****:12597 # @} -- {Connected}
[1316873979] {*****:12597 # @} -- {Disconnected}
[1316874180] {*****:31029 # @} -- {Connected}
[1316874203] {*****:31029 # @} -- {Disconnected}
[1316874219] {*****:31285 # @} -- {Connected}
[1316874219] {*****:31285 # @} -- 12345
[1316874225] {*****:31285 # @} -- {Disconnected}
[1316874235] {*****:31541 # @} -- {Connected}
[1316874235] {*****:31541 # @} -- 12345
[1316874247] {*****:31541 # @} -- {Disconnected}
[1316874891] {*****:60471 # @} -- {Connected}
[1316874891] {*****:60471 # @} -- 12345
[1316874891] {*****:60471 # @} -- 89012
[1316874894] {*****:60471 # @} -- {Disconnected}

Схема подключения, на сколько я вижу отличается только "IPPROTO_TCP" или нет? :) дело в fpc или в чем-то еще?
278
24 сентября 2011 года
Alexander92
1.1K / / 04.08.2008
Я бы начал с того, что переписал один в один, как написано в работающем коде. :) (в данном случаем - в моем). Скажу честно: не думаю, что дело в fpc. Хочу обратить ваше внимание на такой момент: когда я писал свою версию, я столкнулся с тем, что логин и пароль нужно отправлять разными пакетами, иначе возникает ошибка, близкая к вашей. Например,
 
Код:
send(S, "12345\r\n89012\r\n", 14, 0);

уже не работает. Возможно, это специфика сервера, я не успел подробно разобрать этот момент в серверном коде.
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
Боже. Я так и думал.. Я отсылаю pointer :(
[1316876398] {*****:20905 # @} -- {Connected}
[1316876398] -- Б@
[1316876398] -- Б@
[1316876414] {*****:20905 # @} -- {Disconnected}
Вот, что от меня приходит.. Не подскажите, пожалуйста как послать тип String? Я в pascal не силён.
51K
24 сентября 2011 года
Vidog
16 / / 25.12.2009
Pointer(Sx) вместо @Sx нужно посылать.
Спасибо огромное)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог