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

Вниз

приложение Клиент-Сервер (winsock)   Найти похожие ветки 

 
Ricko ©   (2004-02-12 17:17) [0]

Никак не получается сделать приложение сочетающее в себе и клиента и сервера. Проблема в следующем: клиент коннектится, сервер: NewClient:=Accept(SockListen,nil,nil). Затем сервер посылает сообщение клиенту: send(NewClient,TextOut,len,0). Но почему то сам же его и принимает. Почему так происходит?


 
Verg ©   (2004-02-12 17:35) [1]


> Ricko ©   (12.02.04 17:17)  
> Почему так происходит?


Ошибка в программе.


 
Swimmer ©   (2004-02-12 19:48) [2]

Нужно поменять настройки портов: Порт сервера и порт клиента в одном приложении должны быть разными.


 
Ricko ©   (2004-02-13 09:02) [3]

>Swimmer ©  
> Нужно поменять настройки портов: Порт сервера и порт клиента в одном приложении должны быть разными.

Это аксиома?


 
Polevi ©   (2004-02-13 13:01) [4]

где анализ результатов вызовов winsock ф-ий ?


 
Ricko ©   (2004-02-16 09:17) [5]

Может кто даст ссылки на subj


 
Digitman ©   (2004-02-16 09:27) [6]


> Может кто даст ссылки на subj


может кто-то в конце-концов код свой приведет здесь ?


 
Ricko ©   (2004-02-16 09:44) [7]

По просьбам телезрителей привожу код:

program Mag;
uses windows,winsock;
const
    WM_SOCKET  = WM_USER+785;

var
 WinClass         : TWndClass;
 hInst            : HWND;
 Handle           : HWND;
 hEditIn,hEditOut,hEditHost : HWND;
 hBtnSent,hBtnConnect : HWND;
 Msg              : TMSG;
 info             : TWSADATA;
 MyAddrTCP,ClientAddrTCP : TSockAddr;
 SockList,client  : integer;
 TextIn           : array[0..1023] of char;
 HostName         : array[0..127] of char;

// Отправление сообщения
procedure ClickBtnSent;
var
  TextOut : array[0..127] of char;
  len     : integer;
begin
 len:=GetWindowTextLength(hEditOut)+1;
 GetWindowText(hEditOut,TextOut,len);
 SetWindowText(hEditIn,TextOut);
 send(Client,TextOut,len,0);
end;

// Коннектимся к серверу
procedure ClickBtnConnect;
begin
 GetWindowText(hEditHost,HostName,SizeOf(HostName));
 client:=socket(AF_INET,SOCK_STREAM,0);
 ClientAddrTCP.sin_family:=AF_INET;
 ClientAddrTCP.sin_port:=htons(1024);
 ClientAddrTCP.sin_addr.S_addr:=d_addr(HostName);
 connect(client,ClientAddrTCP,sizeOf(ClientAddrTCP))=0
end;

// Выход из программы
procedure ShutDownProg;
begin
 ShutDown(SockList,SD_BOTH);
 CloseSocket(SockList);
 WSACleanup;
 UnRegisterClass("Tas", hInst);
 ExitProcess(hInst);
end;

function WindowProc(hwnd, msg, wparam, param:longint):longint;stdcall;
begin
 Result:=DefWindowProc(hwnd,msg,wparam,lparam);
 case Msg of
   WM_SOCKET : begin
                if lparam=FD_ACCEPT then
                begin
                  client:=Accept(SockList,nil,nil);
                  SetWindowText(hEditIn,"Client connect");
                end;
                if lparam=FD_READ then
                begin
                  recv(client,TextIn,SizeOf(TextIn),0)
                  SetWindowText(hEditIn,TextIn);
                end;
                if lparam=FD_CLOSE then
                begin
                  ShutDown(client,1);
                  CloseSocket(client);
                end;
               end;
   WM_DESTROY : ShutDownProg;
   WM_COMMAND : begin
                  if lparam=hBtnSent then ClickBtnSent;
                  if lparam=hBtnConnect then ClickBtnConnect;
                end;
 end;
end;

begin
    // Создание окна и назначение обработчика событий
    // ...  
    // Запуск сервера
    WSAStartup(MakeWord(2,0),info);
    Socklist:=socket(AF_INET,SOCK_STREAM,0);
    MyAddrTCP.sin_family:=AF_INET;
    MyAddrTCP.sin_port:=htons(1024);
    MyAddrTCP.sin_addr.S_addr:=htonl(INADDR_ANY);
    bind(socklist,MyAddrTCP,sizeof(MyAddrTCP));
    listen(socklist,SOMAXCONN);
    WSAAsyncSelect(
       socklist,Handle,WM_SOCKET,FD_ACCEPT+FD_READ+FD_CLOSE);
    while(GetMessage(Msg,Handle,0,0))do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end.


 
Digitman ©   (2004-02-16 09:52) [8]

что за жуткая каша из клиентской и серверной части ?
у тебя программа функции чего выполняет ? клиента ? сервера ?

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

потом будет разговор


 
Ricko ©   (2004-02-16 10:00) [9]

Вопрос был как сделать клиент-сервер в одном приложении


 
Polevi ©   (2004-02-16 10:07) [10]

для listen сокета достаточно FD_ACCEPT и FD_CLOSE
после accept необходимо вызвать WSAAsyncSelect для полученного хендла с FD_READ FD_WRITE FD_CLOSE


 
Verg ©   (2004-02-16 10:16) [11]

Когда ты обрабатываешь события сокета, то как ты отличаешь в связи с каким сокетом произошло это событие?
И вообще,

Старшее слово (word) lparam - это ошибка
Младшее слово lparam - это событие (FD_***)

А wparam - это собственно сокет.

Вот такого разбора сообщения я пока не вижу....


 
Digitman ©   (2004-02-16 10:19) [12]


> Вопрос был как сделать клиент-сервер в одном приложении


но это же вовсе не значит, что одни и те же переменные (например, хэндл некоего сокета) используются и той и другой логической частью приложения !

например,  у тебя и кл.часть и серв.часть используют в разное время одну и ту же переменную Client

а ведь каждый из клиентов должен иметь свое собственное гнездо, создаваемое вызовом socket()

а сервер имеет в общем случае свои собственные 1 + N гнезд, где самое первое гнездо - слушающее (создаваемое таким же вызовом ф-ции socket), а прочие N гнезд - совершенно отдельные  гнезда, по одному на каждого потенциально подключаемого клиента, создаваемые вызовом accept()


 
Verg ©   (2004-02-16 10:22) [13]

Если интересует первоисточник:

MSDN:

When one of the nominated network events occurs on the specified socket s, the application"s window hWnd receives message wMsg. The wParam parameter identifies the socket on which a network event has occurred. The low word of lParam specifies the network event that has occurred. The high word of lParam contains any error code.


 
Digitman ©   (2004-02-16 10:24) [14]


> Может кто даст ссылки на subj


http://book.itep.ru, см.раздел "Winsock", там все расписано , ч.н., "на огурцах", влоть до графической циклограммы установки TCP/IP-соединения между кл. и серв. частью

штудируй от корки до корки !


 
Rouse_ ©   (2004-02-16 10:35) [15]

http://book.itep.ru/7/sock_71.htm
http://gem.dpt.ustu.ru/InterNetBook/Contents.htm



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

Форум: "Сети";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.034 c
14-1079797054
Kolyan
2004-03-20 18:37
2004.04.18
linux


1-1080633907
Saturn_
2004-03-30 12:05
2004.04.18
ScrollBar


14-1079710412
Orion2
2004-03-19 18:33
2004.04.18
Зацените рассказик


4-1076495701
}{enon
2004-02-11 13:35
2004.04.18
Как узнать стиль кнопки в другом приложении?


1-1080670936
TALLA
2004-03-30 22:22
2004.04.18
Импорт CBuilder DLL по имени функций не получается, по индексу ок





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский