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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2010, 18:24   #1
Boris-Britva
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 14
Сообщение winsok

Пытаюсь создать клиент-сервер с помощью winsok, но не получается.
Можете привести простейший пример посылки текста от сервера и вывод его в едите клиента ? Буду очень благодарен!
Boris-Britva вне форума Ответить с цитированием
Старый 29.12.2010, 18:39   #2
Boris-Britva
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 14
По умолчанию

делаю так

сервер
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  ClientSocket : TSocket;
  sin               : sockaddr_in;
  Buf              : string;
  WSAData     : TWSAData;
begin
 WSAStartup($0101,WSAData);
 ClientSocket:=socket(AF_INET,SOCK_STREAM,0);
  sin.sin_family:=AF_INET;
  sin.sin_port:=htons(110);
  sin.sin_addr.S_addr:=inet_addr('127.0.0.1');
  if connect(ClientSocket,sin,SizeOf(sin)) <>0 then
  showmessage('connected');
  Buf:='12345';
  send(ClientSocket,Buf,SizeOf(Buf),0);
end;
клиент
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  ServerSocket,ClientSocket: TSocket;
  ServerAddr, ClientAddr: TSockAddr;

  WSAData: TWSAData;
  Buf:string;r;
begin
  WSAStartup($0101,WSAData);
  ServerSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  ServerAddr.sin_family:=AF_INET;
  ServerAddr.sin_port:=htons(110);
  ServerAddr.sin_addr.S_addr:=INADDR_ANY;
  bind(ServerSocket,ServerAddr,SizeOf(ServerAddr));
  listen(ServerSocket,10);
  recv(ClientSocket,Buf,SizeOf(Buf),0);
  edit1.Text:=buf;
end;
Boris-Britva вне форума Ответить с цитированием
Старый 29.12.2010, 23:24   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

1) В сообщении выше ты перепутал коды клиента и сервера
2)Порт лучше выбрать с более высоким номером, а то 110 может быть занят.
3) На сервере после listen нужно еще добавить
Код:
 ClientSocket:= accept( ServerSocket, nil, nil);
4) В send и recv вторым параметром явно нужно передавать не string, а char или что-нибудь в этом роде.
5)На будущее
Код:
Buf: string;
//================
recv(ClientSocket,Buf,SizeOf(Buf),0);
Sizeof(Buf) не равно Length(Buf), а именно длину строки ты и хотел передать в функцию.

Вобщем исправленный вариант будет выглядеть как-то так(передает символ):
Сервер:
Код:
var

  ServerSocket,ClientSocket: TSocket;
  ServerAddr, ClientAddr: sockaddr_in;
  WSAData: TWSAData;
  Buf:char;

begin

  WSAStartup($0101,WSAData);

  ServerSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

  FillChar(ServerAddr,SizeOf(TSockAddr),0);

  ServerAddr.sin_family:=AF_INET;
  ServerAddr.sin_port:=htons(5005);
  ServerAddr.sin_addr.S_addr:=INADDR_ANY;

  bind(ServerSocket,ServerAddr,SizeOf(ServerAddr));

  listen(ServerSocket,0);

  ClientSocket:= accept( ServerSocket, nil, nil);

  recv(ClientSocket,Buf,1,0);

  edit1.Text:=Buf;

end;
Клиент:
Код:
var

  ClientSocket : TSocket;
  sin : sockaddr_in;
  Buf : char;
  WSAData : TWSAData;

begin

  WSAStartup($0101,WSAData);

  ClientSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

  FillChar(sin,SizeOf(TSockAddr),0);

  sin.sin_family:=AF_INET;
  sin.sin_port:=htons(5005);
  sin.sin_addr.S_addr:=inet_addr('127.0.0.1');

  if connect(ClientSocket,sin,SizeOf(sin)) <>SOCKET_ERROR then
  showmessage('connected') else showmessage('couldnt connect to server');

  Buf:='7';

  send(ClientSocket,Buf,1,0);

end;
P.S. Передавать строку - это легкое домашнее упражнение
Единственный способ стать умнее - играть с более умным противником.

Последний раз редактировалось Sam Gold; 29.12.2010 в 23:28.
Sam Gold вне форума Ответить с цитированием
Старый 30.12.2010, 16:14   #4
Boris-Britva
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 14
По умолчанию

Большое спасибо! работает=)
Boris-Britva вне форума Ответить с цитированием
Ответ


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