Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2007, 20:22   #1
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
По умолчанию Помогите с серверной частью на WinSock

Помогите пожалуста! Сервер должен работать в неблокирующем режиме. При подключении клиента выдётся ошибка.
Вот исходник :
Цитата:
program Serv;
uses
Windows,Messages,WinSock;
var
pMsg:TMsg;
wData:WSAData;
sServer,sClient:TSocket;
localaddr,clientaddr:sockaddr_in;
iSize,ReadySock,iMode,ret:Integer;
ReadSet:TFDSet;
RecBuff:array[0..1024] of char;
s:String;

begin
if WSAStartup(MakeWord(1,1),wData) <>0 then
begin
MessageBox(0,'Ошибка при загрузке Winsock','Message',0);
exit;
end;
sServer:=socket(AF_INET,SOCK_STREAM ,IPPROTO_IP);
if sServer=INVALID_SOCKET then
begin
MessageBox(0,'Ошибка создания сокета','Message',0);
exit;
end;
ioctlsocket(sServer,FIONBIO,iMode);
localaddr.sin_addr.S_addr:=htonl(IN ADDR_ANY);
localaddr.sin_family:=AF_INET;
localaddr.sin_port:=htons(4902);
if bind(sServer,localaddr,sizeOf(local addr))=Socket_Error
then begin
MessageBox(0,'Ошибка связывания сокета','Message',0);
exit;
end;
listen(sServer,4);
while (true) do
begin
FD_ZERO(ReadSet);
FD_SET(sServer,ReadSet);
ReadySock:=select(0,@ReadSet,nil,ni l,nil);
if (ReadySock = SOCKET_ERROR) then
begin
MessageBox(0,'ReadySock_Error','Mes sage',0);
exit;
end;
if (FD_ISSET(sServer,ReadSet)) then
begin
iSize:=SizeOf(sClient);
sClient:=accept(sServer,@clientaddr ,@iSize);// Здесь происзодит ошибка
if sClient=INVALID_SOCKET then
begin
MessageBox(0,'Ошибка в сокете клиента','Message',0);
break;
end;
ret:=recv(sClient,RecBuff,1024,0);
if (ret=Socket_Error) then
begin
MessageBox(0,'Ошибка получения данных','Message',0);
break;
end;
s:=RecBuff;
MessageBox(0,RecBuff,'Принятые данные',0);
closeSocket(sClient);
end;
end;
while GetMessage(pMsg,0,0,0) do
begin
TranslateMessage(pMsg);
DispatchMessage(pMsg);
end;
end.
Miha вне форума Ответить с цитированием
Старый 25.06.2007, 08:43   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

в Windows официально нет понятия не блокирующего режима. Есть эмуляция в Indy AntiFrosen он по-мойму называется из вкладки Misc
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 25.06.2007, 10:30   #3
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

В Windows не то чтобы есть понятие неблокирующего режима, который идет аж от изначальных Bercley Sockets, но в дополнение к основному стеку протоколов существует асинхронное расширение сокетного транспорта построенное на оконных сообщениях.
А в приведенном коде ошибка в том, что указывается неверный размер принимающей структуры. Должно быть iSize:=SizeOf(sockaddr_in);
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Старый 25.06.2007, 10:41   #4
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Незнаю поможет те это или нет, но для каждого конекта ты должен открывать новую нить(Thread). И уже в нити идёт конект и обработка запроса, что бы небыло конфликтов. Я создавал собственный сервер но на компонентах ClientSocket и ServerSocket.
Если хош могу кинуть исходник, посмотришь.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 25.06.2007, 11:10   #5
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
По умолчанию

Спасибо большое всем ,что уделили внимание.
Действительно был неверно указан размер iSize.

Последний раз редактировалось Miha; 25.06.2007 в 11:25.
Miha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Winsock не соединяет Da$aD Работа с сетью в Delphi 0 11.07.2008 22:57
параметрический запрос с частью слова в качестве параметра yulia БД в Delphi 6 09.05.2008 20:27
Proxy в WinSock SHEI'TI Работа с сетью в Delphi 3 29.03.2008 18:27