Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2018.02.04;
Скачать: CL | DM;

Вниз

сокеты   Найти похожие ветки 

 
aturasama   (2016-02-10 22:39) [0]

подскажите пожалуйста, только начинаю сокеты изучать.
клиент шлет запросы через инди:
IdHTTP.Post(url, myTStrings, resStream);

сервер на сокетах, вроде бы стандартно написан:
WSAStartup, далее поток ListenThread
в котором
listenSocket := socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
listenAddr.sin_family := AF_INET;
listenAddr.sin_port := htons(ListenPort);
listenAddr.sin_addr.S_addr := htonl(INADDR_ANY);
Bind(listenSocket, listenAddr, sizeof(listenAddr))
ну и Listen(listenSocket, 50)

далее в цикле жду подключения
clientSocket := accept(listenSocket, @clientAddr, @size);
при подключении создаю поток, в котором читаю данные:
lenRecv:= Recv(clientSocket, buff, 2048, 0);

если локально на машине то получаю нормальный запрос вида:

POST / HTTP/1.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 192
Host: 127.0.0.1:88
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)

param1=param1&param2=param2

запустил сервер в локальной сетке на разных ПК- всё приходит кроме post параметров. победить не удалось, решил передавать и читать ответ клиентом через GET, запихнув параметры в base64 и в заголовок User-Agent. По сетке локальной приходит вроде бы нормально, через инет у некоторых то же, но с одного ПК теряется часть оконцовки.
общий размер запроса с параметрами не более 500 байт.

может кто сталкивался и подскажет где туплю?


 
Dimka Maslov ©   (2016-02-11 10:38) [1]

Для начала надо уметь различать сокеты от протокола http. А потом изучить то и другое.


 
KSergey ©   (2016-02-11 15:01) [2]

> далее в цикле жду подключения
> clientSocket := accept(listenSocket, @clientAddr, @size);
>
> при подключении создаю поток, в котором читаю данные:
> lenRecv:= Recv(clientSocket, buff, 2048, 0);

Следует почитать теорию.

Recv() вычитывает пришедший пакет, размер которого - любой. Может 1 байт приехать, может 539, может сразу всё отправленное.
Стоит почитать как использовать Recv() и как научиться понимать, что получено всё, что ожидается и пора собственно начинать анализировать полученное уже на содержательную часть (это будет несколько последовательных вызывово Recv со "сонкатенацией" содержимого полученных буферов).

Готовый код не подскажу, ибо вспоминать надо.

Рекомендую вот такую книжку, ровно по этой теме:
http://www.booksgid.com/programmer/4645-programmirovanie-v-setjakh-microsoft.html


 
KSergey ©   (2016-02-11 15:52) [3]

> (это будет несколько последовательных вызывово Recv со "сонкатенацией" содержимого полученных буферов).

слово и так не понятное, а я еще и буквы всё в нём переставил.
Следует читать так:

(это будет несколько последовательных вызовов Recv() с "конкатенацией" содержимого полученных буферов).



Страницы: 1 вся ветка

Текущий архив: 2018.02.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1455227853
Dmk
2016-02-12 00:57
2018.02.04
Округление


6-1284889393
Cobalt
2010-09-19 13:43
2018.02.04
Как скачать XML, а не обработанный уже HTML?


15-1469302746
Юрий Зотов
2016-07-23 22:39
2018.02.04
Как много нам открытий чудных...


2-1455547592
Незарегистрированный
2016-02-15 17:46
2018.02.04
Как корректно сравнить/присвоить Longint с Сишными TRUE и FALSE?


2-1454909399
Signal
2016-02-08 08:29
2018.02.04
Сети..Сети..и выбор интерфейса в TServerCocket