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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 22:44   #1
marikcool
 
Регистрация: 22.02.2009
Сообщений: 3
Восклицание winsock udp сервер в потоке, не работает при создании формы или обращению к VCL компоненту

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,winsock,unit2, ScktComp,syncobjs;

type
 ThreadWSS=class(TThread)
 udp_socket:TSocket;
 public
  procedure Execute;override;
 end;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    log: TMemo;
    Button1: TButton;
    BitBtn2: TBitBtn;
    ClientSocket1: TClientSocket;
    procedure BitBtn1Click(Sender: TObject);
    procedure updatelog;
    procedure Button1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  twss:ThreadWSS;
  dstr:string;
  CriticalSection: TCriticalSection;

implementation

{$R *.dfm}


function arrbyte_to_string(packet:array of byte;len:integer):string;
var
str:string;
x:integer;
begin
  for x:=0 to len-1 do str:=str+char(packet[x]);
  result:=str;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
twss:=ThreadWSS.Create(false);  //start now
end;

procedure ThreadWSS.Execute;
var
WSAData:TWSAData;
addr,from,clientaddr,serveraddr:TSockaddr;
buffer:array[0..2048] of byte;
Len,BufferLen,flags,fromlen:integer;
begin
  WSAStartup($0202,WSAData);
  udp_socket:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  addr.sin_family:=AF_INET;
  addr.sin_port:=htons(5555);
  addr.sin_addr.s_addr:=INADDR_ANY; // äëÿ âñåõ èíòåðôåéñîâ
  //addr.sin_addr.S_addr:=inet_addr('127.0.0.1');
  if bind(udp_socket,addr,sizeof(addr))<>0 then begin
    dstr:='[-] Bind';
    Synchronize(form1.updatelog);
    exit;
  end;
  dstr:='[+] Waiting connection';
  Synchronize(form1.updatelog);
  // Ñ×ÈÒÛÂÀÅÌ ÁÓÔÔÅÐ ÁÅÑÊÎÍÅ×ÍÎ!
  while true do begin// áóäåì îáðàáàòûâàòü áåñêîíå÷íî âñå ïîäêëþ÷åíèÿ
  // recvfrom
  Len:=recvFrom(udp_socket, buffer, sizeof(buffer)-1, 0, from, fromlen);
  dstr:=inttostr(WsaGetLastError());
  Synchronize(form1.updatelog);
  if Len>0 then begin
    //Buffer[Len]:=0;
    showmessage('opa');
  end;
  sleep(1);
  end;
end;

procedure TForm1.updatelog;
begin
    log.lines.add(dstr);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  twss:=ThreadWSS.Create(false);  //start now
  Application.CreateForm(TForm2, Form2);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  //CriticalSection:=TCriticalSection.create;
  twss:=ThreadWSS.Create(false);  //start now
  twss.Priority:=tpHighest;
  clientSocket1.address:='127.0.0.1';
  clientSocket1.port:=80;
  clientSocket1.Active:=true;
  twss.Resume;
end;
Тут вырезок с кода в отдельный проект, создаю на winsock udp сервер в потоке, работает идеально.
поток стартует при BitBtn1Click
когда же создаю поток и следом создаю форму Application.CreateForm(TForm2, Form2); получаю ошибку 10014 или 10022 наудачу.
также когда перевевожу TclientSocket в режим Active такие же ошибки.
пробовал и критические секции и приоритет, убирал дебаг синхронизации главную форму морозил, и по разному объявлял, подставлял разные буфера, старт сокета 1.1 и 2 вообщем ничего не работает. помогите кто может.
проект прикрепил.
Вложения
Тип файла: rar WINSOCK_SRV.rar (188.6 Кб, 16 просмотров)
marikcool вне форума Ответить с цитированием
Старый 01.10.2010, 00:57   #2
marikcool
 
Регистрация: 22.02.2009
Сообщений: 3
По умолчанию

все сделал
fromlen:=SizeOf(sockaddr_in);
Len:=recvFrom(udp_socket, buffer, sizeof(buffer)-1, 0, from, fromlen);
marikcool вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Winsock: UDP сервер под Win студент_88 Win Api 0 05.09.2010 22:01
ошибка при закрытии формы после обработки в потоке furstenberg Общие вопросы Delphi 7 05.07.2010 12:19
Фоновая музыка при создании формы JNLYSk Мультимедиа в Delphi 3 13.09.2009 20:08
Добавить запись при создании формы Zerone БД в Delphi 9 20.03.2009 16:06
При создании формы! Anton Помощь студентам 4 08.08.2007 08:20