Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

чат на winsock   Найти похожие ветки 

 
Sergey12345   (2005-04-11 23:11) [0]

Здравствуйте! Пишу TCP чат на чистом winapi с использованием winsockets. У меня есть сервер и клиент который приконнектился к этому серверу. В обоих приложениях висит строка "Введите фразу для отправки" и если например клиент отправит фразу серверу, то сервер не может ее получить пока не отправит что нибудь клиенту, то есть  recv срабатывает, но не выводится на экран, то что пришло, пока не сработает ожидаемый ввод с клавиатуры у клиента, и так в обоих приложениях. Вопрос в следующем, как сделать так чтобы сообщения выводились на экран сразу после их приема , т.е. если recv приняло, то сразу вывело то что приняло???
Спасибо!
З.Ы. Если у кого есть исходники простого чата на winsock, то буду благодарен если поделитесь.


 
wistful ©   (2005-04-11 23:50) [1]

отправил тебе на мыло.
написан на скорую руку, так что получилось криво.


 
Sergey12345   (2005-04-12 00:15) [2]

Спасибо конечно, но меня по TCP проьоколу интересует, а ты по UDP прислал.
Но все равно спасибо.

Господа, жду Ваших предложений :) !


 
Digitman ©   (2005-04-12 08:28) [3]


> жду Ваших предложений


предложение одно - показывай свой код


 
Ozone ©   (2005-04-12 10:28) [4]

>  Sergey12345   (11.04.05 23:11)

1. Копать в сторону "неблокирующих" сокетов

или

2. Копать в сторону потоков.

Выбор варианта зависит от задачи, в принципе. В твоем случае подойдет как тот, так и другой, ИМХО.


 
Sergey12345   (2005-04-12 18:46) [5]


> > жду Ваших предложений
>
>
> предложение одно - показывай свой код


Да код у меня на C++.
Там я создал свой класс TCPсервер и TCPClient.
Он Вам будет интересен???


 
NikNet ©   (2005-04-12 23:32) [6]

2Автор и 2wistful

Пришоите мне на мыло? тоже NikNet@yandex.ru :)

Вот у меня вообще сервер не чего не получает пока
длину сообшение не укажешь!!! но отку сервер может
знать какая длина сообщение ПОМОГИТЕ?

Воть кодик.


Program Server;

{$APPTYPE CONSOLE}

uses
 WinSock,
 Windows;

Var
bsiz:word;
LAddr:TSockAddr;
wsa:WSADATA;
Local_Socket1,LOcal_Socket2:TSocket;
buf:{array[0..999] of char}String;
i:integer;

Function BlockReadSock:boolean;
Var
 Size:integer;
begin
 Result:=False;
 Repeat
  if (IoctlSocket(Local_Socket2,$4004667F, Size)<0) then exit;
  if Size=0 then exit
 until (Size>0);
 SetLength(buf,Size);
 Recv(Local_Socket1,buf,Size,0);
 Result:=True;
end;

begin
WSAStartUp(2,wsa);
{Инициализация локального сокета}
Local_Socket1:=Socket(AF_INET,SOCK_STREAM, 0);
 LAddr.sin_family:=AF_INET;
 LAddr.sin_port:=htons(2525);
 LAddr.sin_addr.S_addr:=INADDR_ANY;
if bind(Local_Socket1,LAddr,sizeof(LAddr))=SOCKET_ERROR then
begin
 messagebox(0,pchar("Невозможно инициализировать сокет!"),pchar("Ошибка"),0);
 Halt(0);
end;
 ZeroMemory(@buf, SizeOf(buf));
 Listen(Local_Socket1,1);
 i:=sizeof(LAddr);
While True DO
begin
 LOcal_Socket2:=accept(Local_Socket1,@LAddr,@i);
 while true do
begin
  {Процедура по обработке входящих сообщений}
   BlockReadSock;
   Writeln(Buf);
   Break;
end;
end;
  ShutDown(LOcal_Socket2, 1);
  CloseSocket(Local_Socket2);
  ShutDown(Local_Socket1, 1);
  CloseSocket(Local_Socket1);
end.



 
XProger ©   (2005-04-13 14:17) [7]

Для таких, благих целей сгодятся 2 метода:
1) асинхронные сокеты
2) проверка буфера по таймеру

Если будешь использовать второй - поставь сокету опцию "не блокировать"

ioctlsocket(sock, FIONBIO, flag)


 
Human_jan   (2005-07-13 23:47) [8]

Только на Delphi
компоненты: TClientSocket,
один TEdit, и один TMemo.

у TEdit"а в обработчике событий OnKeyDown пиши
if key = vk_return then ClientSocket1.Socket.SendText(Edit1.Text);

у TClientSocket"а в обработчике событий OnClientRead пиши

var
S: String;
begin
S := Socket.ReceiveText;
memo1.lines.add(s);

Сервер:кинь на форму следующие компоненты: TServerSocket,
один TEdit, и один TMemo.

у TEdit"а в обработчике событий OnKeyDown пиши

var
I: Integer;
begin
if key = vk_return then
for i := 0 to ServerSocket1.ActiveConnections - 1 do
ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);

у TServerSocket"а в обработчике событий OnServerClientRead пиши

var
S: String;
begin
S := Socket.ReceiveText;
memo1.lines.add(s);


 
Digitman ©   (2005-07-14 08:13) [9]


> Он Вам будет интересен?


наше дело предложить, ваше - отказаться


 
Digitman ©   (2005-07-14 08:33) [10]


> отку сервер может
> знать какая длина сообщение


отту.
это должен сделать клиент, в полном соответствии с разработанным тобой протоколом инф.обмена между сервером и клиентом

велик и могучее русский языка..


 
Eraser ©   (2005-07-14 15:55) [11]

Sergey12345
Human_jan


С пом. Indy то что вы тут намудрили реализуется в 2-5 строчек кода, при этом вы получаете полноценный многопоточный сервер.


 
Dr.Nemo   (2005-08-01 16:40) [12]

Удалено модератором


 
Polevi ©   (2005-08-01 16:51) [13]

а я спрячусь и меня не найдет



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
4-1126204799
alexa
2005-09-08 22:39
2005.11.13
DlgDirList


8-1118757001
Wm.DIGGER
2005-06-14 17:50
2005.11.13
AVI DirectDraw, DirectShow ... Как?


4-1126372344
illy
2005-09-10 21:12
2005.11.13
Запуск закрытие приложений


4-1126100827
Unit1
2005-09-07 17:47
2005.11.13
WM_MOUSEMOVE


9-1119391313
SOL
2005-06-22 02:01
2005.11.13
delphiX