|
#1
|
|||
|
|||
Клиент - сервер
Будте добры, помогите поалуста напишите пожалуста код, чтоб XE2 поддерживала...
Надо написать клиент серверное приложение на winsock или indy 10 пожалуста очень прошу, чтоб смог разбираться, ну или обьясните по какому принципу вааще работает передача по сети... Спасибо за внимание |
#2
|
||||
|
||||
Для принципов существует гугл. Для "напишите мне" есть раздел работа и тот же гугл, исходников сотни (если не тысячи). Форум для случая "не получается там-то".
В общих чертах WinSock - для сервера создается сокет, привязывается к адресу, устанавливается в режим прослушки и принимаются клиенты. Для клиента - создается сокет и подключается к серверу. Дальше обмен данными через send и recv. jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
Думаешь я не искал,, я неделю искал, то находил не то то находил но не работает...поэтто му я сюда и написал, если вы знатоки то киньте пожалусто ссылку тогда для кода
|
#4
|
||||
|
||||
Я себя знаю: я гуглить умею очень плохо. Но даже я нагуглил за 40 секунд.
Берем, пишем, получаем. Третья ссылка. Исчерпывающая информация для начала, по блокирующему режиму. От себя добавлю, лучше делать WSAStartup($202, Data). И что весь WinSock, описанный в статье, можно юзать без добавления каких-то файлов. Просто прописать uses WinSock. Просто писать очередной мануал на 10 страниц по каждому такому вопросу в N+1й раз ни у кого желания нет, учитывая, что таковых уже много. Ещё кстати видел подробнейший разбор WinSock в книге Флёнова "Delphi глазами хакера". Там было всё, вплоть до HTTP клиента и неблокирующего TCP сервера. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.03.2012 в 01:35. |
#5
|
|||
|
|||
Хм...Спасибо огромное, ток там разбирают winsock 2 , можно ли исспользовать winsock просто?
|
#6
|
||||
|
||||
Они похожи. Я с сетями хоть работал и немного, но различий не встречал.
jmp $ ; Happy End! The Cake Is A Lie. |
#7
|
|||
|
|||
bind(socks,@sockaddr,16); - кидает ошибку на @sockaddr, а точнее на @...
Убрал её - скомпилировалось...Но повлияет это на дальнейшую работу?Причем тут эта @? |
#8
|
|||
|
|||
2-ую ошибку кидает на Server.s_addr:=inet_addr(PChar('127.0.0.1')); а точнее на PChar
[DCC Error] Unit1.pas(44): E2010 Incompatible types: 'PAnsiChar' and 'PWideChar' исправил на PAnsiChar - также хочу знать не повлияет это на дальнейшую работу? |
#9
|
|||
|
|||
Кароче сделал я этот проект на XE2 b и нехера не работает
Сервер : Код:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,winsock, Vcl.StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; inf:TWSADATA; socks,sockc,i,z:integer; sockaddr:TSockAddr; s: array[0..100] of Char; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //инициализируем библиотку WSAStartup($202,inf); //присваиваем переменной протокол socks:=socket(AF_INET,SOCK_STREAM,0); //адресс сервера SockAddr.sin_family:=AF_INET; SockAddr.sin_port:=htons(21); SockAddr.sin_addr.S_addr:=htonl(INADDR_ANY); //размер адресса сокета i:=sizeof(sockaddr); //привязываем структуру к сокету Bind(socks,SockAddr,sizeof(SockAddr)); //прослушиваем порт Listen(Socks,3); while true do begin sockc:=accept(socks,@sockaddr,@i); if sockc<>-1 then begin z:=recv(sockc,s,100,0); if z<>-1 then ShowMessage(s); end; end; end; end. Клиент : unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,winsock, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; inf: TWSADATA; socks: integer; sockaddr: TSockAddr; Server:TInaddr; s: array[0..100] of Char; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin //присоединяемся к серверу connect(socks,sockaddr,sizeof(sockaddr)); //тправка сообщения s:='Test'; if connect(socks,sockaddr,sizeof(sockaddr))<>-1 then begin send(socks,s,Length(s),0); end; end; procedure TForm1.FormCreate(Sender: TObject); begin //подключаем адресс сервера Server.S_addr:=inet_addr(PAnsiChar('127.0.0.1')); //инициализируем библиотку WSAStartup($202,inf); //присваиваем переменной протокол socks:=socket(AF_INET,SOCK_STREAM,0); //адресс клиента SockAddr.sin_family:=AF_INET; SockAddr.sin_port:=htons(21); sockaddr.sin_addr := Server; end; end. Последний раз редактировалось Admin, 07.03.2012 в 21:07. |
#10
|
||||
|
||||
1) Заверни код в [code ][ /code] (без пробелов)
2) В функции socket последним параметром лучше юзать константу IPPROTO_IP вместо 0. 3) @ означает адрес. В WinSock вроде бы параметр передается как var, т.е. и так по адресу. 4) PAnsiChar на работу не повлияет. Думаю. Просто в XE2 строки приравняли к юникодовым строкам, что не всегда есть гуд. В данном случае делфа должна сама перекодировать в Ansi при юзании прямого преобразования. 5) Юзать порт 21 не советую. Лучше брать значение >1000. Но это не очень важно. Что именно не работает? Не стартует сервер? Не подключается клиент? Не передаются данные? Или передаются неверно? jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.03.2012 в 18:54. |
#11
|
|||
|
|||
Не идет отправка сообщения, то есть не подключается вааще не работает
|
#12
|
|||
|
|||
А на Indy не проще сделать? Там для этого есть неплохие компоненты... пользоваться удобно, не надо писать всю инициализацию. А работает все равно через winsock.
|
#13
|
|||
|
|||
У меня инди токо 10,
а в гугле искал там на 9 ток в 10 нету write read writeln readln Если не трудно подсказать код то подскажи=) Мне кароче вааще кароче такая прога нужна --- подскажите мож как лучше сделать --- У чувака на компе сервер - работает всегда, У меня клиент., я нажимаю кнопку подключить - мне отчет что подключен Дальше я через эдит отправляю ему сообщения И когда захочу могу отключится от него |
#14
|
||||
|
||||
Судя по вашему сообщению, вам лет 15, а, если учитывать орфографию, то всего 5. Немудрено, что вы ничего не можете найти в поисковых серверах, они рассчитаны на достаточно грамотных людей. Попробуйте без распальцовки и фени составить грамотный запрос и, уверяю вас, найдётся достаточно много ссылок на различные примеры. А вот когда у вас что-либо не получится, тогда есть смысл обращаться за конкретной помощью.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
ApxaHGe1 (08.03.2012)
|
#15
|
|||
|
|||
Блять...нахер мне оформлять сообщение, я не на уроке русского....Нормальные люди уже подсказали как и что...
У меня остался один вопрос - как строку типа string сделать строкой типа array of ansichar ? |