Текущий архив: 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.48 MB
Время: 0.03 c