Форум: "Начинающим";
Текущий архив: 2018.02.04;
Скачать: [xml.tar.bz2];
Внизсокеты Найти похожие ветки
← →
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¶m2=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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.001 c