Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

чат на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.054 c
2-1129779847
Alex77777
2005-10-20 07:44
2005.11.13
Нужно отфильтровать базу по пустому полю


14-1129914900
Gudvin
2005-10-21 21:15
2005.11.13
Востановить удаленные файлы


14-1130142418
kot andrei
2005-10-24 12:26
2005.11.13
книжка для детей


14-1130061257
alexsis
2005-10-23 13:54
2005.11.13
AVer Tv Studio 305 Плюсы и минусы


9-1119805079
wiz
2005-06-26 20:57
2005.11.13
Rust! новая демка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский