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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2009, 12:03   #1
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
Вопрос WinSock Проблеммы с получением

В общем пытаюсь написать программку на WinSock
Вот код сервера:
Основное:
Код:
procedure TForm4.Button1Click(Sender: TObject);
begin
a.sin_family:=AF_INET;
a.sin_port:=5555;
a.sin_addr.S_addr:=inet_addr(PChar('127.0.0.1'));
InitSocket;
end;

procedure TForm4.InitSocket;

begin
w.wVersion:=MakeWord(1,0);
WSAStartup(MakeWord(1,0),w);
Server:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if server=INVALID_SOCKET then
Memo1.Lines.Add('Ошибка инициализации сокета')
else
Memo1.Lines.Add('Сокет инициализирован');
if bind(server, a,sizeof(a))<>0 then
Memo1.Lines.Add('Ошибка привязки')
else
Memo1.Lines.Add('Привязано');
ServerTHRead:=Accepting.Create(true);
ServerTHRead.Priority:=tpLower;
ServerTHRead.Resume;

ServerTHRead2:=RecvTH.Create(true);
ServerTHRead2.Priority:=tpLower;
ServerTHRead2.Resume;
end;
1ый поток:
Код:
procedure Accepting.Execute;
begin
while True do
begin
Form4.Memo1.Lines.Add('Началось прослеушивание порта');
listen(Form4.Server,1);
Form4.Memo1.Lines.Add('Ожидание коннекта');
accept(Form4.Server, Form4.ADDR ,nil);
Form4.Memo1.Lines.Add('Коннект!');;
end;
end;
2ой поток:
Код:
procedure RecvTH.Execute;
var
int:Integer;
str:array [0..255] of char;
begin
while True do
begin
  int:= recv(Form4.Server,str,SizeOf(str),0);
  if int<>-1 then
  begin
    Form4.Memo1.Lines.Add(str[1]);
  end;
end;
end;
Вот клиент:
Код:
procedure TForm3.Button1Click(Sender: TObject);
var
str:string;
begin
WSdata.wVersion:=MakeWord(1,0);
WSAStartup(MakeWord(1,0),WSdata);
str:='ыыы';
client:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if client=INVALID_SOCKET then
Memo1.Lines.Add('Ошибка инициализации сокета')
else
Memo1.Lines.Add('Сокет инициализирован');
if connect(client, addr, SizeOf(addr))<>0 then
Memo1.Lines.Add('Ошибка соеденения')
else
Memo1.Lines.Add('Соеденено');





end;
Код отправки:
Код:
procedure TForm3.Button4Click(Sender: TObject);
var
dsada:array [0..255] of char;
begin

dsada[1]:='1';
send(client,dsada,1,0);
end;
Данные в мемо не выводяться(я незнаю вообще сервер их получает или нет)
В чём проблемма?
И вообще правильно я делаю?

Последний раз редактировалось AngelOfDeath; 18.01.2009 в 12:37.
AngelOfDeath вне форума Ответить с цитированием
Старый 18.01.2009, 17:56   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

После вызова listen сокет используется, чтобы принимать новых клиентов. Для каждого клиента accept возвращает дескриптор другого сокета, который и нужно использовать для дальнейшей работы с этим клиентом.
Somebody вне форума Ответить с цитированием
Старый 19.01.2009, 02:30   #3
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

Спасибо, помогло
Изменил
Вот так всё работает
Код отправки:
Код:
procedure TForm3.Button4Click(Sender: TObject);
var
chars:array [0..255] of char;
i:Integer;
str:string;
begin
FillChar(chars,sizeof(chars),0);
str:=Edit1.Text;
for I := 1 to Length(Edit1.Text)  do

    chars[i-1]:=Edit1.Text[i];

send(client,chars,255,MSG_OOB);
end;
Код получения:
Код:
procedure RecvTH.Execute;

begin
while True do
begin

MSG;

end;
end;

procedure RecvTH.MSG;
var
int:Integer;
str:array [0..255] of char;
strok:string;
i:Integer;
begin
listen(Form4.Client,1000000);
  int:= recv(Form4.Client,str,255,0);
  if int<>-1 then
  begin
  Form4.Memo1.Lines.Add('Получен пакет!');
  for I := 0 to 255 do
  begin
  strok:=strok+str[i]
  end;
  Form4.Memo1.Lines.Add(strok);
  end;
end;

Последний раз редактировалось AngelOfDeath; 19.01.2009 в 03:39.
AngelOfDeath вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с получением хэндла модуля Боевой Пингвин Общие вопросы C/C++ 3 09.11.2008 17:06
Проблеммы с массивом Almost_Famous Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 21.04.2008 21:25
Проблеммы функции MessageDlg Snake_ua Общие вопросы Delphi 4 01.11.2007 08:08
Помогите с получением TStream в CGI boades Работа с сетью в Delphi 0 25.10.2007 10:25
Проблеммы с использованием функций работы со строками Copy и Pos Soso Общие вопросы Delphi 13 09.08.2007 16:01