Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Пример использования WinSock


Автор: SneG0K 22.12.2007, 17:43
Я тут решился взяться за изучения винсок... кодю на винсок2, и мне нужен примерчик использования клиент-сервера на дельфи....
ну типа сервер запускается и ждет соединения, клиент конектится и передает серверу строку, сервер эту строку сохраняет в переменную...
Если не сложно smile  дайте примерчик, с подробным описанием(коментариями)! Заранее спасибо

Автор: MetalFan 22.12.2007, 19:53
а в MSDN разве нету?

Автор: SneG0K 22.12.2007, 21:47
Who is MSDN???

Автор: MetalFan 23.12.2007, 00:08
http://msdn2.microsoft.com/en-us/default.aspx

Автор: SneG0K 23.12.2007, 14:04
У меня страница вообще не открываеться!!!=( Может всетаки дадите примерчик? smile  smile 

Автор: Exai1e 23.12.2007, 14:12
в поиск

Автор: SneG0K 23.12.2007, 20:41
user posted image Я весь гугл облазил, но ниче не нашел... мне нужен исходник с коментариями, а везде либо непашущие исходники, либо без коментариев!!!

Автор: THandle 23.12.2007, 21:08
Цитата(SneG0K @  23.12.2007,  14:04 Найти цитируемый пост)
У меня страница вообще не открываеться!!!=( Может всетаки дадите примерчик?


SneG0K, страница открывается, но только очень долго smile

Автор: Sanchezzz 23.12.2007, 21:39
SneG0K, плохо искал. там это есть если на ассамблер есть вот кс одна
http://www.realcoding.net/article/view/1833
http://www.google.com/search?hl=ru&client=opera&rls=ru&hs=aHq&q=winsocket%2Bapi%2Bdelphi&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=

Автор: SneG0K 27.12.2007, 23:39
Так ладно... я решил закончить со своими глупыми вопросами и перейти на уровень выше....

Так вот... я запускаю сервер
Код

uses
SysUtils, Winsock, Windows;
..........
var
start : TWSAData;
begin
WSAStartup(MAKRWORD(1,0), start); /инициализирую винсок


но вот все таки я не понял... как открыть порт и прослушивать его? и когда прийдут данные записать их в переменную i smile  smile Прошу отнестись к этому с уважением.... я просто хочу научится и понять как это.... желательно с коментариями

Добавлено через 4 минуты и 25 секунд
Так ладно... я решил закончить со своими глупыми вопросами и перейти на уровень выше....

Так вот... я запускаю сервер
Код

uses
SysUtils, Winsock, Windows;
..........
var
start : TWSAData;
begin
WSAStartup(MAKRWORD(1,0), start); /инициализирую винсок


но вот все таки я не понял... как открыть порт и прослушивать его? и когда прийдут данные записать их в переменную i smile  smile Прошу отнестись к этому с уважением.... я просто хочу научится и понять как это.... желательно с коментариями

Автор: MetalFan 28.12.2007, 07:38
socket,bind,listen,accept?

поиши в DRKB, http://narod.yandex.ru/cgi-bin/yandsearch?user=delphiworld&text=winsock&where=2

Автор: SneG0K 28.12.2007, 17:06
А там нет онлайн версии... а то у меня нет возможности скачать 30 мб=(


Автор: Qu1nt 29.12.2007, 01:21
Поиском на форуме национальность не разрешает пользоваться?

Автор: SneG0K 29.12.2007, 01:38
Фууууууууу...... Поиск того, что мне надо не дает! Поиск это всего лиш система, а не разум! И она не может догадатся, что мне надо!!! Вот поэтому я и спросил здесь!!!

Автор: MetalFan 29.12.2007, 09:02
блин, DW доступен онлайн. ты бы хоть посмотрел, что я тебе за ссылку дал

Автор: SneG0K 29.12.2007, 12:21
Смотрел я ту тему... там того, что мне надо нет!!!

Автор: SneG0K 30.12.2007, 00:28
Спасибо вссем, кто хоть чуть-чуть мне помогал... После долгих бессонных ночей, проведенных в гугле, он все же дал мне необходимый результат! Всем спасибо... И с наступающим новым годом!!! Путь в новом 2008 году у вас всех будет все хорошо!

Автор: Mopgop 4.3.2008, 20:44
мдя, хоть сцылкой бы поделился.. толк от темы то? )))

действительно ссылки на DW мало дают предстваления.
не ужели никто не пишет примеров наподобие:
запуск сервера
прослушиваем порт
коннект юзверя
юзверь посылает сообщение
сервак принимает сообщение
сервак отправляет подтверждение принятия сообщения.

ну и + обработку исключительных ситуаций: сервер закрылся, а клиенты были подключены; клиент подключается, а сервака нет; пакет не дошел в целости, еще раз отправить.

балин плиз срочно инфы надо и побольше, читать явно не лень! просто дали задание сделать сервак-клиент. Ну я написал чат через IdUDPServer/client + там же еще пересылка файлов, обновление юзверей, смена подсети работы проги, игра крестики-нолики (в ней уже передача команд через IdTCPServer/Client), и куча всего, обработка всевозможных ошибок и т.п. и терь сообщают мол надо было только с пом. винсокетов. [censored 6] :о( плиз пример для передачи банальных сообщений дайте с комментами, и я уже всё остальное по новой прикручу.
ЗЫ: желательно было бы книгу, но только не Эффективное прог-ние тср/ip. ибо йа не знать С :( smile 

Автор: Elite 4.3.2008, 23:33
Mopgop, Мда все это печальноя уже на 3 форуме один и тот же вопрос задаю по сокетам, и ни на одном не дали нормального ответа, толи народ незнает, а скорее всего знает, но помогать никто не торопятся на одном так даж и ответили и вобще чтобы на русскоязычных форумах помогли без предварительной выпендрежки большая редкость,  складывается впечатления, что некоторые участники кроме как в свом посте написать до боли заезженную ссылку www.google.ru, ничего незнают притом если полистаь чуток форум в этом можно убедиться в оочую, а знаменитая фраза "юзай гугл" smile  уже вошла в историю.... smile 
А по сокетам скачай книгу М. Фленова delphi в шутку и всерьез что умеют хакеры, там неплохо написано о них, и о том как кодить клиенты и  серверы.

Автор: SneG0K 5.3.2008, 00:08
Блин... Кто-то один обратитесь ко мне, я вам помогу с сокетами smile Тема трехмесячной давности.... Мне тоже никто толком ниче не !рассказал!, но я нашел литературу и все сам прочитал!!! Между прочим из гугля!!!

 smile 
Эх разленился народ!

Добавлено через 1 минуту и 50 секунд
Цитата(Elite @  4.3.2008,  22:33 Найти цитируемый пост)
 скачай книгу М. Фленова delphi в шутку и всерьез что умеют хакеры, там неплохо написано о них

Хоть одна умная мысль smile (к участникам форума не относится, у половины из них всегда умные мысли)...



Сорь за оффтоп smile 

Автор: Elite 5.3.2008, 14:17
http://forum.vingrad.ru/forum/s/365f3cf7b5caad2ffa46190a8ffdd24c/topic-199056.html
Вот тема помоги если можеш, в нете находил много тем по отправке писем, но лиш некоторые работают правильно, но вопрос в том как отправить письмо с вложением, т.к. код приведенный в теме почемуто неотправляет такое письмецо.

Цитата(SneG0K @  5.3.2008,  00:08 Найти цитируемый пост)
Мне тоже никто толком ниче не !рассказал!, но я нашел литературу и все сам прочитал!!! Между прочим из гугля!!

Вот поэтому многие и говорят, что мол если искал я и рылся по всему нету в поисках инфы то почему я должен подсказывать начинающим, "пусть сами копошатся как и я", нехотят русские помогать друг другу, в своем высказывании я не имел ввиду этот форум, я отметил общее положение дел, на нескольких кодерских форумах, т.к. все больше и больше остается вопросов без ответа. smile 

Автор: SneG0K 5.3.2008, 21:45
Цитата(Elite @  5.3.2008,  13:17 Найти цитируемый пост)
 нехотят русские помогать друг другу

Хм... я Украинец smile И я не против помочь. Просто когда больше узнаеш, некоторые вопросы попросту начинают казаться идиотскими! и на них не охота отвечать smile 

Автор: MetalFan 5.3.2008, 22:15
Цитата(Elite @  5.3.2008,  14:17 Найти цитируемый пост)
все больше и больше остается вопросов без ответа

каков вопрос, таков ответ.
если спрашивают ерунду, или то, что недавно уже обсуждалось (что показывает лень или неумение человека поиском пользоваться), то естественно никому по 10 раз объяснять не захочется.
а если вопрос интересный и/или правильно задан, то и ответ/совет всегда дельный дадут.

Автор: SneG0K 5.3.2008, 22:32
Согласен с 
MetalFan

Автор: Mopgop 20.5.2008, 10:10
Цитата("Йа")
плиз пример для передачи банальных сообщений дайте с комментами, и я уже всё остальное по новой прикручу.
ну и + обработку исключительных ситуаций: сервер закрылся, а клиенты были подключены; клиент подключается, а сервака нет; пакет не дошел в целости, еще раз отправить.

ну йа писал конкретно 

ушел в аську к Снежку.. 

Автор: elestrago 23.5.2008, 07:36
лови

Код

program winsock_server; 
//Простейшее приложение-сервер.
//Сокеты работают в блокирующем режиме.
//На каждое соединение создается отдельный поток.
{$apptype console}
uses
sysutils,
winsock,
windows;
var
vwsadata : twsadata;
vlistensocket,vsocket : tsocket;
vsockaddr : tsockaddr;
trid : thandle;
const
cport = word(33);
csigexit = 'q';
//Процедура отдельного потока для каждого клиента.
procedure socketthread;
var sockname : tsockaddr;
abuf : array of char;
vbuf : string;
vsize : integer;
s :tsocket;
bufsize : integer;
begin
s := vsocket;
if s = invalid_socket then exit;
vsize := sizeof(tsockaddr);
getpeername(s, sockname, vsize);
writeln(format('client accepted, remote address [%s].',[inet_ntoa (sockname.sin_addr)]));
//Определяем размер буфера чтения для сокета
vsize := sizeof(bufsize);
getsockopt(s,sol_socket,so_rcvbuf,pchar(@
bufsize),vsize);
writeln(format('receive buffer size [%d]',[bufsize]));
setlength(abuf,bufsize);
repeat
//Получаем данные. Процедура работает в блокирующем режиме,
//таким образом следующая строка кода не получит управление,
//пока не поступят данные от клиента.
vsize := recv(s,abuf[0],bufsize,0);
if vsize<=0 then break;
setlength(vbuf,vsize);
lstrcpyn(@vbuf[1],@abuf[0],vsize);
writeln(format('received from cleint: %s',[vbuf]));
until vbuf = 'q';
writeln(format('client disconnected, remote address [%s].',[inet_ntoa(sockname.sin_addr)]));
setlength(abuf,0);
closesocket(s);
end;
 
begin
writeln('starting application...');
//Объявляем, что программа будет использовать windows sockets.
if wsastartup($101,vwsadata)<>0 then halt(1);
writeln('using windows sockets.');
//Создаем прослушивающий сокет.
vlistensocket := socket(af_inet,sock_stream,ipproto_ip);
writeln(format('creating socket on port [%d].',[cport]));
if vlistensocket = invalid_socket then halt(1);
fillchar(vsockaddr,sizeof(tsockaddr),0);
vsockaddr.sin_family := af_inet;
vsockaddr.sin_port := htons(cport);
vsockaddr.sin_addr.s_addr := inaddr_any;
writeln('binding socket...');
//Привязываем адрес и порт к сокету.
if bind(vlistensocket,vsockaddr,sizeof(tsockaddr)) <> 0
then halt(1);
//Начинаем прослушивать.
if listen(vlistensocket,somaxconn) <> 0
then halt(1);
writeln('socket status: listening.');
repeat
//Ожидаем подключения.
vsocket := accept(vlistensocket,nil,nil);
//Клиент подключился, запускаем новый процесс на соединение.
createthread(nil,0,@socketthread,0,0,trid);
until false;
closesocket(vlistensocket);
wsacleanup;
end. 



function wsastartup(wversionrequired: word; var wsdata: twsadata): integer; stdcall;
Функция сообщает ОС, что в любом процессе приложения могут быть использованы функции winsock. Функция должна быть вызвана один раз при запуске приложения перед использованием любой функции winsock.
function wsacleanup: integer; stdcall;
Функция сообщает ОС, что приложение более не использует winsock. Должна быть вызвана перед завершением приложения.
function socket(af, struct, protocol: integer): tsocket; stdcall; 
Функция создает сокет. Порт и адрес задается в функции bind (сервер) или connect (клиент). Входящий параметр af - спецификация семейства сокетов (af_inet, af_ipx и др.), struct - спецификация типа нового сокета (принимает значение sock_stream или sock_dgram), protocol - специфический протокол, который будет использоваться сокетом. Если функция выполнена без ошибок, она возвращает дескриптор на новый сокет, если ошибки есть, возвращается invalid_socket. 
function connect(s: tsocket; var name: tsockaddr; namelen: integer): integer; stdcall; 
Функция соединения для клиента. Структура адреса содержит порт (необходимо привести функцией htons) и адрес (для клиента необходимо привести из имени или спецификации ip4 - xxx.xxx.xxx.xxx). 
function bind(s: tsocket; var addr: tsockaddr; namelen: integer): integer; stdcall;
 Функция ассоциирует адрес с сокетом. Структура адреса содержит порт (необходимо привести функцией htons) и адрес (для сервера обычно указывается inaddr_any - любой).
 function send(s: tsocket; var buf; len, flags: integer): integer; stdcall;
 Функция отправки данных. Помещает в очередь сокета s кусок данных из buf, длиной len. Последний параметр отвечает за вид передачи сообщения. Может быть проигнорирован (0). 
 function recv(s: tsocket; var buf; len, flags: integer): integer; stdcall;

Функция получение данных.

Автор: elestrago 23.5.2008, 07:54
да и вот еще ссылка на мсдн почитай там много полезного http://msdn.microsoft.com/en-us/library/ms738545(VS.85).aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)