Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сокеты


aturasama ©   (2016-02-10 22:39:00) 

подскажите пожалуйста, только начинаю сокеты изучать.
клиент шлет запросы через инди:
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¶m2=param2

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

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


KSergey   (2016-02-11 15:52:00) [1]

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

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

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


KSergey   (2016-02-11 15:01:00) [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


Dimka Maslov   (2016-02-11 10:38:00) [3]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо