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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2007, 17:24   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию big troubles with winsock

Проблема с изпользованием сокетов
ошибка подключения к клиентскому серверу

код главного сервера такой
Код:
program ret;
 
uses
  windows,
  WinSock2;
 
const
MaxLength=100;
ClientName='s1208-09';
 
type
MsgString=String[MaxLength];
 
function ClientThread(s:TSocket):integer;
Var RecvBuff:MsgString; ret:integer;
begin
repeat
result:=0;
ret:=recv(s,RecvBuff,maxLength,0);
if ret=0 then break
else
if ret=SOCKET_ERROR then
begin
  dec(result,1);
  break;
end;
until false;
if recvBuff[1]='d' then
MessageBox(0,'All is OK. Command has received','Error',MB_ICONERROR)
else
MessageBox(0,'What the hell was send there??!!!','Error',MB_ICONERROR);
CloseSocket(s);
end;
 
function NetThread(localaddr:sockaddr_in):integer;
Var Server,Client:TSocket; Thread:THandle; ThreadId:dword; Size:integer;
clientaddr:TSockAddrIn;
Begin
result:=0;
Server:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
If server=SOCKET_ERROR then
begin
  dec(result,1);
  MessageBox(0,'Creation Server Socket Error','Error',MB_ICONERROR);
  exit;
end;
if bind(Server,@(SockAddr(localaddr)),sizeof(localaddr))=SOCKET_ERROR then
begin
  dec(result,2);
  MessageBox(0,'Bind Error','Error',MB_ICONERROR);
  exit;
end;
listen(Server,15);
repeat
Size:=sizeof(clientaddr);
client:=accept(Server,SockAddr(clientaddr),Size);
If Client=INVALID_SOCKET then
  begin
   dec(result,3);
   MessageBox(0,'Accept Error','Error',MB_ICONERROR);
   break;
  end;
Thread:=CreateThread(nil,0,@ClientThread,@Client,0,ThreadId);
if Thread=0 then
  begin
   dec(result,4);
   break;
  end;
CloseHandle(Thread);
sleep(50);
until false;
closeSocket(Server);
If (result<>-3) and (result<>-4) then result:=0;
end;
 
Var wsd:TWSAData; FNetThread:THandle; NetThreadID:dword;
ret1:integer; s:TSocket; buf:Msgstring; host:Phostent;
localaddr,clientaddr:sockaddr_in; port:word;
begin
if WSAStartUp(MAKEWORD(2,2),wsd)<>0
then halt;
S:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
If s=SOCKET_ERROR then
begin
MessageBox(0,'Creation socket error','Error',MB_ICONERROR);
WSACleanUp;
halt;
end;
port:=htons(5050);
localaddr.sin_addr.S_addr:=htonl(INADDR_ANY);
localaddr.sin_family:=AF_INET;
localaddr.sin_port:=port;
clientaddr.sin_family:=AF_INET;
clientaddr.sin_port:=port;
host:=GetHostbyName(ClientName);
if host=nil then
begin
  MessageBox(0,'Host Error','Error',MB_ICONERROR);
  WSACleanUp;
  halt;
end;
CopyMemory(@clientaddr.sin_addr,host.h_addr,host.h_length);
ret1:=connect(s,@(SockAddr(clientaddr)),sizeof(clientaddr));
If ret1=SOCKET_ERROR then \\\Вот здесь сокет еррор и вылазит
begin
MessageBox(0,'Connect error','Error',MB_ICONERROR);
WSACleanUp;
halt;
end;
buf:='Run';
ret1:=send(s,Buf,sizeof(buf),0);
if ret1=SOCKET_ERROR then
begin
MessageBox(0,'First Sending Error','Error',MB_ICONERROR);
WSACleanUp;
halt;
end;
repeat
FNetThread:=CreateThread(nil,0,@NetThread,@Localaddr,0,NetThreadId);
sleep(300000);
terminateThread(NetThreadId,0);
until false;
\\\Подобные рестарты делаю на случай ошибок ведь в реальной проге сообщений об ошибках \\\\высвечиваться не будет
WSACleanUp;
end.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 25.09.2007, 17:24   #2
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Код клиента:

Код:
program client;
 
uses
  windows,
  winSock2,
  jokes; { Мой модуль }
 
const
MaxLength=100;
 
type
MsgString=String[MaxLength];
 
function ClientThread(s:TSocket):integer;
Var RecvBuff,SendBuff:MsgString; ret:integer;
begin
result:=0;
SendBuff:='done';
repeat
ret:=recv(s,RecvBuff,sizeof(RecvBuff),0);
if ret=0 then break
else
If ret=SOCKET_ERROR then
begin
  MessageBox(0,'Receive Error','Error',MB_ICONERROR);
  dec(result,1);
  break;
end;
MessageBox(0,'Receive Success','Error',MB_ICONERROR);
if RecvBuff[1]='R' then
begin
  Run(@Gallutination); \\\упрощенная функция запуска потока из моего модуля
  ret:=send(s,SendBuff,sizeof(SendBuff),0);
  If ret=SOCKET_ERROR then
   begin
    MessageBox(0,'Send Error','Error',MB_ICONERROR);
    dec(result,2);
    break;
   end;
end
else MessageBox(0,'What the hell was sent there??!!!','Error',MB_ICONERROR);
sleep(50);
until false;
end;
 
function NetThread:integer;
Var Client,Server:TSocket;
ret,Size:integer; serverAddr,clientAddr:sockaddr_in;
Thread:THandle; ThreadId:dword;
Begin
result:=0;
Server:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
If Server=SOCKET_ERROR then
begin
  Dec(result,1);
  MessageBox(0,'Creation server socket error','Error',MB_ICONERROR);
  exit;
end;
ServerAddr.sin_family:=Af_INET;
ServerAddr.sin_port:=htons(5050);
ServerAddr.sin_addr.S_addr:=htonl(INADDR_ANY);
ret:=bind(Server,@(SockAddr(ServerAddr)),sizeof(ServerAddr));
if ret=SOCKET_ERROR then
begin
  Dec(result,2);
  MessageBox(0,'Bind error','Error',MB_ICONERROR);
  exit;
end;
listen(Server,1);
repeat
Size:=sizeof(clientaddr);
Client:=accept(Server,clientaddr,size);
if Client=INVALID_SOCKET then
begin
  MessageBox(0,'Accept Error','Error',MB_ICONERROR);
  dec(result,3);
  break;
end;
Thread:=CreateThread(nil,0,@ClientThread,@Client,0,ThreadID);
If thread=0 then
begin
  MessageBox(0,'Thread Error','Error',MB_ICONERROR);
  dec(result,4);
  break;
end;
CloseHandle(Thread);
until false;
closeSocket(client);
end;
 
Var wsd:TWSAData; pNetThread:THandle; NetThreadId:dword;
begin
if WSAStartup(Makeword(2,2),wsd)<>0 then
begin
MessageBox(0,'WSAInitializing Error','Error',MB_ICONERROR);
WSACleanUp;
halt;
end;
repeat
pNetThread:=CreateThread(nil,0,@NetThread,nil,0,NetThreadId);
sleep(300000);
terminateThread(NetThreadId,0);
until false;
WSACleanUp;
end.
У меня только один вопрос - это косяки сети или мои, кстати потом через минут пять после ошибки сервера вылазит на клиентском компе Сreation Server Socket Error
(не удалось создать клиентский сервер)
Если чё подскажите насчёт оптимизации - буду рад
Я бы не создавал сервер у клиента но мне нужно сначала с главного сервера отправить команду, а потом уже чтобы клиент подключался к серверу и говорил что она выполнена
Помогите плиз! Уже неделю безрезультатно мучаюсь
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 28.09.2007, 10:48   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Я уже сделал такие посты на пяти форумах и никто пока ещё не ответил,
просто лень или типа такие "простые" вещи мы уже не объясняем, может мне это надо было писать в теме винапи?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 28.09.2007, 23:16   #4
xTANATOSx
Подтвердите свой е-майл
 
Регистрация: 15.07.2007
Сообщений: 72
По умолчанию xXx

а у тебя Winsoks какой версиї?

Последний раз редактировалось xTANATOSx; 28.09.2007 в 23:24. Причина: Флуд и недостоверная информация
xTANATOSx вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock (send, recv) AidarBik Работа с сетью в Delphi 1 27.07.2008 15:22
Winsock не соединяет Da$aD Работа с сетью в Delphi 0 11.07.2008 22:57
Proxy в WinSock SHEI'TI Работа с сетью в Delphi 3 29.03.2008 18:27
Многопользовательский сервер на Winsock SirToxa Работа с сетью в Delphi 7 27.03.2008 15:29
работа с WinSock Agasfer Работа с сетью в Delphi 1 13.02.2008 18:54