Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с Winsock 
:(
    Опции темы
elestrago
Дата 31.5.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



В общем парни хочу создать свой маленький сервер используя только винсок но чето у меня не как не получается грамотно его сконструировать 

вот код который я уже сделал он без проверки ошибок!

Код

program serv2;

uses
sysutils,
winsock,
windows;

var
vdata : twsadata;
ClientSocket,vlistensocket : tsocket;
vsockaddr : tsockaddr;
abuf:array of char;
vbuf:string;
iResult:integer;
const
cport = word(33);
bufsize = 512;
begin
wsastartup($101,vdata);
vlistensocket:=socket(af_inet,sock_stream,ipproto_ip);
fillchar(vsockaddr,sizeof(tsockaddr),0);
vsockaddr.sin_family := af_inet;
vsockaddr.sin_port := htons(cport);
vsockaddr.sin_addr.s_addr := inaddr_any;
iResult:=bind(vlistensocket,vsockaddr,sizeof(tsockaddr));
iResult:=listen(vlistensocket,somaxconn);
ClientSocket:=accept(vlistensocket,nil,nil);
closesocket(vlistensocket);
repeat
iResult:=recv(ClientSocket,abuf[0],bufsize,0);
// Проблема вот на это участе не могу не как принять текст помогите дописать этот код чтобы он принимал в нормальном виде текст
until iResult <> 0 ;
closesocket(ClientSocket);
wsacleanup;
end.


да и еще помогите исправить ошибки а то я очень смутно понимаю как работает винсок
--------------------
PM MAIL ICQ   Вверх
Qu1nt
Дата 31.5.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 2
Всего: 50



DRKB:
Код

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. 

PM MAIL   Вверх
elestrago
Дата 31.5.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 23.8.2007
Где: runet

Репутация: 1
Всего: 3



Qu1nt  код из ДРКБ я наверно уже наизусть изучил но я не как не могу понять как он работает....

у меня там проблема, когда пытаюсь получить файл!

файл не могу получить коректно.... вот и пытаюсь понять как работает win sock
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0892 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.