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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2012, 16:30   #1
Slame
Пользователь
 
Регистрация: 07.11.2010
Сообщений: 45
По умолчанию WinSock

Всем добрый день. Вот ребят имею такой код на Delphi но Сокет почему то не создаётся, вернее программа выводит сообщение "Сокет не создан".Уже гуглил и юзал поиск на форуме ответа так и не нашёл.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CreateSocket(MySocket: Tsocket);


begin
MySocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
If (MySocket = INVALID_SOCKET)
Then ShowMessage('Сокет не создан')
Else    begin
 // Ваші подальші дії
end;

end;
procedure TForm1.FormCreate(Sender: TObject);
var
s:Tsocket;
begin
CreateSocket(S);
end;

end.
Slame вне форума Ответить с цитированием
Старый 18.03.2012, 17:54   #2
Slame
Пользователь
 
Регистрация: 07.11.2010
Сообщений: 45
По умолчанию

проблема решена можно удалить тему
Slame вне форума Ответить с цитированием
Старый 21.03.2012, 20:05   #3
Slame
Пользователь
 
Регистрация: 07.11.2010
Сообщений: 45
По умолчанию

Уважаемые программисты Подскажите пжлста как сделать многопользовательский чат чат на Винсокетах. Зародышь сервера есть, хотелось бы узнать по подробней работу с потоками.и Как органиовать рассылку сообщений всем клиентам? Создавать масив поток или масив адресов сокетов?)
Код:
unit Unit1;

interface

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

type
  TMyThread = class(TThread)
private
     { Private declarations }
   protected
     procedure DoWork;
     procedure Execute; override;
   end;
   TmYThread2= class(TThread)
     private
     protected
     procedure Execute; override;
   end;

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

var
  Form1: TForm1;   T1:TMyThread; T2:array [100] of TMyThread2;

implementation
var s:Tsocket; AcceptAddr : Tsockaddr; SizeAcceptAddr : Integer; AcceptSocket : Tsocket; ClientAddr: TSockAddr;   ClientAddrSize:integer; ClientSocket: TSocket;

{$R *.dfm}

Procedure InWinSock();

Var
MyWSAData : WSADATA; ErrWSADATA : integer;
Begin
ErrWSAData := WSAStartUp(MakeWord(2, 0), MyWSAData);
If (ErrWSAData <> 0) then ShowMessage('Бібліотека не була ініціалізована')
Else
// Ваші подальші дії End;

end;
procedure CreateSocket(var MySocket: Tsocket);


begin
MySocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
If (MySocket = INVALID_SOCKET)
Then ShowMessage('Сокет не створений')
Else    begin
 showmessage('sockety is ready');
end;
 end;
 procedure Connect(MySock:Tsocket);

    Var

MySockAddr : TsockAddrIn; ErrBind : integer;
begin

MySockAddr.sin_family := AF_INET;
MySockAddr.sin_port := htons(1024);
MySockAddr.sin_addr.s_addr := inet_addr('127.0.0.1');
ErrBind := bind(MySock, MySockAddr, SizeOf(MySockAddr));
If (ErrBind <> 0) then
ShowMessage('Помилка звязування адреси із сокетом')
Else  begin
    // Ваші подальші дії
end;



 end;
 procedure Query(MySock:Tsocket);
 Var
 ErrListen : integer;
Begin
ErrListen := listen(MySock, 5);
If (ErrListen <> 0) then ShowMessage('Черга для запитів не сформована')
Else Begin
acceptsocket:=10;
showmessage('acceptsocket'+inttostr(acceptsocket));
sizeacceptaddr:=sizeof(sockaddr_in);
AcceptSocket := accept(MySock, @AcceptAddr, @SizeAcceptAddr);
showmessage(inttostr(acceptsocket));
If (AcceptSocket = INVALID_SOCKET) then ShowMessage('Клієнт не приєднався')
else
showmessage('Client has conected');
End;



 end;
 Procedure Sendsms(Mysock:Tsocket);
Var
Buf : array [0..255] of char; ErrSend : integer;
Begin
Buf:='Yeahhhhhh!';
ErrSend := send(AcceptSocket, Buf, SizeOf(Buf), 0);
If (ErrSend = SOCKET_ERROR) then ShowMessage('Помилка передачі даних')
Else
showmessage('msg');

 end;

 procedure TMyThread.Execute;
 begin
   {Если Вы хотите, чтобы процедура DoWork выполнялась лишь один раз - удалите цикл while}
        InWinSock();
CreateSocket(s);
Connect(s);
    Query(s);
        end;

 procedure TMyThread.DoWork();
 begin

 end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 T1:=TMyThread.Create(false);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 sendsms(s);
end;

end.
Slame вне форума Ответить с цитированием
Старый 21.03.2012, 20:38   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Вам книгу написать? Это в двух(да и в десяти) строках не объяснишь. В Delphi разумнее будет осуществить все с помощью компонентов TClientSocket/TServerSocket. В WinSock можно, при соединении, выдавать идентификационный номер(ну тут фантазия) и потом по нему идентифицировать клиентов. Сами думайте.
Цитата:
хотелось бы узнать по подробней работу с потоками
Думаю, что вам CreateThread() "по горло" хватит.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 21.03.2012, 20:45   #5
Slame
Пользователь
 
Регистрация: 07.11.2010
Сообщений: 45
По умолчанию

Лабороторная по Винсокетам.
а про потоки я имел в виду где их логичней применить? При отсылку сообщения?или пр иподключения клента?
Slame вне форума Ответить с цитированием
Старый 22.03.2012, 10:40   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Я чаты не писал, но думаю, что потоки применять нужно в первом случае. Т.е. при отправлении сообщений. Главную обработку(инициализацию,подключение ) тоже нужно разместить в отдельно, НО морду чата в главном потоке.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
winsock Pein95 Работа с сетью в Delphi 4 04.07.2011 18:33
WinSock Onekey Обсуждение статей 0 20.08.2010 12:04
Winsock n3sh C/C++ Сетевое программирование 2 25.07.2010 17:55
WinSock profi Win Api 8 11.01.2010 21:13
WinSock Killbrum Win Api 1 18.10.2009 15:15