Главная страница
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
1-1351687767
cobalt
2012-10-31 16:49
2018.02.04
Декларация и исполнение процедур/функций


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


15-1469741401
Юрий
2016-07-29 00:30
2018.02.04
С днем рождения ! 29 июля 2016 пятница


1-1355759763
harisma
2012-12-17 19:56
2018.02.04
QuickReport: pageCount


2-1455227853
Dmk
2016-02-12 00:57
2018.02.04
Округление