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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с сервером (WinSock), не принимает соединение 
V
    Опции темы
kent
Дата 4.2.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!
Вобщем написал клиент и сервер, но сервер не принимает входящее соединение...
при попытке получить сокет клиента (ф-я accept) сокет <> 0

Вот код сервера:
Код

unit MainUnitServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WSA : TWSAData;
  sock1 : TSocket;
  sock2 : TSocket;
  addr : sockaddr_in;
  addr1 : sockaddr_in;
  addr1_len : u_int;
  buff : String;
  b : u_int;
  l : u_int;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
     Memo1.Clear;
     if WSAStartup($101, WSA) <> 0 then
     begin
       MessageBox(Form1.Handle, 'Error WSAStartup', 'Message', MB_ICONERROR);
       WSACleanup;
       Halt;
     end;
     addr.sin_family := AF_INET;
     addr.sin_port := htons(7500);
     addr.sin_addr.S_addr := INADDR_ANY;
     sock1 := Socket(AF_INET, SOCK_STREAM, 0);
     if sock1 = INVALID_SOCKET then
       MessageBox(Form1.Handle, 'Error Socket', 'Message', MB_ICONERROR);
     b := bind(sock1, addr, SizeOf(addr));
     if b = SOCKET_ERROR then
       MessageBox(Form1.Handle, 'Error Bind', 'Message', MB_ICONERROR);
     l := listen(sock1, SoMaxConn);
     if l = SOCKET_ERROR then
       MessageBox(Form1.Handle, 'Error Listen', 'Message', MB_ICONERROR);
     Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     sock2 := accept(sock1, @addr1, @addr1_len);
     if sock2 = 0 then
     begin
       Memo1.Lines.Add('Client Connected...');
       Timer1.Enabled := False;
     end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var r : u_int;
begin
     r := recv(sock2, buff, SizeOf(buff), 0);
     if r <= 0 then
       MessageBox(Form1.Handle, 'No Messages', 'Message', MB_ICONERROR)
     else
       Memo1.Lines.Add(buff);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     CloseSocket(sock1);
     CloseSocket(sock2);
     WSACleanup;
     Form1.Close;
end;

end.


Код клиента:
Код

unit MainUnitClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WSA : TWSAData;
  clientsocket : TSocket;
  addr : sockaddr_in;
  c : u_int;
  buff : String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
     Memo1.Clear;
     if WSAStartup($101, WSA) <> 0 then
     begin
       MessageBox(Form1.Handle, 'WSAStartup error', 'Message', MB_ICONERROR);
       WSACleanup;
       Halt;
     end;
     addr.sin_family := AF_INET;
     addr.sin_port := htons(7500);
     addr.sin_addr.S_addr := inet_addr('127.0.0.1');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     clientsocket := Socket(AF_INET, SOCK_STREAM, 0);
     if clientsocket = INVALID_SOCKET then
       MessageBox(Form1.Handle, 'Socket error', 'Message', MB_ICONERROR);
     c := connect(clientsocket, addr, SizeOf(addr));
     if c = SOCKET_ERROR then
       MessageBox(Form1.Handle, 'Connect error', 'Message', MB_ICONERROR)
     else
       MessageBox(Form1.Handle, 'Connect Done', 'Message', MB_ICONINFORMATION);
end;

procedure TForm1.Button2Click(Sender: TObject);
var s : u_int;
begin
     buff := Memo1.Text;
     s := send(clientsocket, buff, SizeOf(buff), 0);
     if s <= 0 then
       MessageBox(Form1.Handle, 'Message Not Send', 'Message', MB_ICONERROR)
     else
       MessageBox(Form1.Handle, 'Message Send', 'Message', MB_ICONINFORMATION);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     CloseSocket(clientsocket);
     WSACleanup;
     Form1.Close;
end;

end.


Помогите найти ошибку ....
PM MAIL ICQ   Вверх
RaIDeR
Дата 5.2.2006, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(kent @ 4.2.2006, 14:57 Найти цитируемый пост)

Всем привет!
Вобщем написал клиент и сервер, но сервер не принимает входящее соединение...
при попытке получить сокет клиента (ф-я accept) сокет <> 0

А с чего ты взял что в случае успеха ф-ция accept вернёт 0 ?
Цитата

If no error occurs, accept returns a value of type SOCKET which is a descriptor for the accepted socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Как сказанно она вернёт дескриптор созданного сокета, а в случае ошибки INVALID_SOCKET == - 1, но никак не 0 ...

Вот так по мойму было б правильно:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     sock2 := accept(sock1, @addr1, @addr1_len);
     if sock2 <> INVALID_SOCKET then
     begin
       Memo1.Lines.Add('Client Connected...');
       Timer1.Enabled := False;
     end;
end;

PM MAIL   Вверх
kent
Дата 5.2.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



RaIDeR, твой пример также не работает...

Цитата

А с чего ты взял что в случае успеха ф-ция accept вернёт 0 ?

Так описано в книге "Эффективное программирование TCP\IP" Йон Снейдер.


Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Screen.jpg 60,13 Kb
PM MAIL ICQ   Вверх
kent
Дата 5.2.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



RaIDeR, ты был прав, функция возвращает не ноль (похоже что в книжке ошибка)... Твой пример не работал потому что я не указал размер структуры...
Код

addr1_len := SizeOf(addr1);


Вот рабочий сервер:
Код

unit MainUnitServer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WSA : TWSAData;
  sock1 : TSocket;
  sock2 : TSocket;
  addr : sockaddr_in;
  addr1 : sockaddr_in;
  addr1_len : u_int;
  buff : array [1..25] of Char;
  b : u_int;
  l : u_int;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
     Memo1.Clear;
     if WSAStartup($101, WSA) <> 0 then
     begin
       MessageBox(Form1.Handle, 'Error WSAStartup', 'Message', MB_ICONERROR);
       WSACleanup;
       Halt;
     end;
     addr.sin_family := AF_INET;
     addr.sin_port := htons(7500);
     addr.sin_addr.S_addr := INADDR_ANY;
     sock1 := Socket(AF_INET, SOCK_STREAM, 0);
     if sock1 = INVALID_SOCKET then
       MessageBox(Form1.Handle, 'Error Socket', 'Message', MB_ICONERROR);
     b := bind(sock1, addr, SizeOf(addr));
     if b = SOCKET_ERROR then
       MessageBox(Form1.Handle, 'Error Bind', 'Message', MB_ICONERROR);
     l := listen(sock1, SoMaxConn);
     if l = SOCKET_ERROR then
       MessageBox(Form1.Handle, 'Error Listen', 'Message', MB_ICONERROR);
     Timer1.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     addr1_len := SizeOf(addr1);
     repeat
       sock2 := accept(sock1, @addr1, @addr1_len);
       if sock2 <> INVALID_SOCKET then
         Memo1.Lines.Add('Client connected...');
     until sock2 <> INVALID_SOCKET;
     Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     if recv(sock2, buff, SizeOf(buff), 0) > 0 then
     begin
       Memo1.Lines.Add('Received: ' + buff);
       FillChar(buff, SizeOf(buff), #0);
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     CloseSocket(sock1);
     CloseSocket(sock2);
     WSACleanup;
     Form1.Close;
end;

end.


Клиент:
Код

unit MainUnitClient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WSA : TWSAData;
  clientsocket : TSocket;
  addr : sockaddr_in;
  c : u_int;
  buff : String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
     Memo1.Clear;
     if WSAStartup($101, WSA) <> 0 then
     begin
       MessageBox(Form1.Handle, 'WSAStartup error', 'Message', MB_ICONERROR);
       WSACleanup;
       Halt;
     end;
     addr.sin_family := AF_INET;
     addr.sin_port := htons(7500);
     addr.sin_addr.S_addr := inet_addr('127.0.0.1');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     clientsocket := Socket(AF_INET, SOCK_STREAM, 0);
     if clientsocket = INVALID_SOCKET then
       MessageBox(Form1.Handle, 'Socket error', 'Message', MB_ICONERROR);
     c := connect(clientsocket, addr, SizeOf(addr));
     if c = SOCKET_ERROR then
       MessageBox(Form1.Handle, 'Connect error', 'Message', MB_ICONERROR)
     else
       MessageBox(Form1.Handle, 'Connect Done', 'Message', MB_ICONINFORMATION);
end;

procedure TForm1.Button2Click(Sender: TObject);
var s : u_int;
begin
     buff := Memo1.Text;
     s := send(clientsocket, buff[1], Length(buff), 0);
     if s <= 0 then
       MessageBox(Form1.Handle, 'Message Not Send', 'Message', MB_ICONERROR)
     else
       MessageBox(Form1.Handle, 'Message Send', 'Message', MB_ICONINFORMATION);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     CloseSocket(clientsocket);
     WSACleanup;
     Form1.Close;
end;

end.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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