Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/16: Рейтинг темы: голосов - 16, средняя оценка - 5.00
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
1

ServerSocket & ClientSocket

08.07.2013, 22:17. Просмотров 2885. Ответов 29
Метки нет (Все метки)

Делал программу на основе Server/ClientSocket, сервер должен был просто отправить клиенту строку текста. Проблема в том, что когда я тестировал ее на разных компах, возникала ошибка... Вся соль, как я понял в открытости портов.
...
Нужно ли, что б порт был открыт на обеих компах?
Как можно открыть порт на компьютере рантайм? Можно ли это вообще сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 22:17
Ответы с готовыми решениями:

ClientSocket & ServerSocket
подскажите как быть если у клиента и у сервера динамический ip-адресс.

Задача по ServerSocket & ClientSocket
Всем кому не лень помочь в написании следующей проги, ответьте! У меня такая...

ServerSocket и ClientSocket
Как передать сообщение не всем а именно нужному клиенту? Например подключено к...

ServerSocket и ClientSocket
Дайте пжл инфу или книгу электронную по ServerSocket и ClientSocket... Буду...

Dll и ClientSocket/ServerSocket
Есть клиентское приложение с Buttom, edit,label и clientsocket. Как сделать...

29
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
08.07.2013, 22:23 2
Вся соль в том, что если компьютеры за NAT, никакое открытие портов не поможет.
0
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
09.07.2013, 09:16 3
Цитата Сообщение от Anubis_ Посмотреть сообщение
Можно ли это вообще сделать?
Можно если на хосте с NAT, например, активен и доступен UPnP-сервис
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
09.07.2013, 09:43  [ТС] 4
Подскажите что мне делать... Если нужна инф о осе, вот: windows7 максимальная х64.
0
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
09.07.2013, 09:55 5
NAT - http://g.smotrov.com/btports/nat.htm
Соединение компьютер-компьютер через интернет с динамическими IP - http://habrahabr.ru/post/129347
Прямое (peer to peer) соединение через NAT. Часть 1: Типы NAT-ов - http://ilya-314.livejournal.com/109479.html

UDP hole punching - http://en.wikipedia.org/wiki/UDP_hole_punching
STUN - http://en.wikipedia.org/wiki/STUN
NAT Traversal - http://en.wikipedia.org/wiki/NAT_traversal
2
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
09.07.2013, 11:24 6
Цитата Сообщение от Anubis_ Посмотреть сообщение
нужна инф о осе
Прежде всего нужна инфа о сетевой конфигурации каждого из "разных компов".
Представь хотя бы подробные отчеты стандартных виндовых утилит - ipconfig, tracert, route.
Кр.того нужна инфа об активности службы UPnP и, возможно, socks-прокси на каждом из компов или на подконтрольных маршрутизирующих устройствах, к которым подключены компы.
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
09.07.2013, 12:17  [ТС] 7
Извините Вынесли мой 15летний мозг двумя фразами. С сетями работаю первый раз... Я сделаю отчеты, скину. Пока актуально...
Р.S. Большое спасибо за ссылки
0
Dr_Quake
Заблокирован
09.07.2013, 14:50 8
Убежденный, В винде файрвол можно подключить - он сам при открытии сокета и созданном правиле пнёт upnp.
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
09.07.2013, 14:52  [ТС] 9
Дело в том, что Nod32(
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
09.07.2013, 15:02  [ТС] 10
Может, я дно, но не знаю, что делать с tracert и route. Отчет конфига:
0
Миниатюры
ServerSocket & ClientSocket  
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
09.07.2013, 15:08 11
tracert ip4_адрес_удаленного_хоста
route print
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
10.07.2013, 01:10  [ТС] 12
Спасибо за наводки. Ща буду предпренимать чето
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
12.07.2013, 10:47  [ТС] 13
Еще вопрос. За что отвечают методы OРЕN и СLОSЕ в этих компонентах. Когда их ю3ать
0
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
12.07.2013, 11:12 14
Open сервера активирует его - открывает локальный порт на всех локальных интерфейсах на прослушивание вх.запросов на соединение с сервером.

Close сервера, соответственно, деактивирует нго, закрывая слушающий локальный порт.
Все установленные на этот момент соединения с сервером при этом остаются по-прежнему активными, т.е. Close сервера не разрывает уже установленные к этому моменту соединения с клиентами.

Open клиента запускает механизм установки соединения с сервером, "координаты" которого заданы св-вами, Address, Port, Host, Service

Close клиента, соответственно, закрывает ранее успешно установленное с сервером соединение.
1
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
12.07.2013, 13:31  [ТС] 15
Доступно сенк, я понял... Только эти методы вызивать после асtivе:=truе, или до этого?
0
mss
2633 / 2258 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
12.07.2013, 13:36 16
Цитата Сообщение от Anubis_ Посмотреть сообщение
эти методы вызивать после асtivе:=truе, или до этого?
Ни до ни после.
Либо ты пользуешь св-во Active либо пару Open/Close , ибо установка свойства Active в True неявно приводит к вызову Open и, соотв-но, установка в False -> к вызову Close
1
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
13.07.2013, 00:51  [ТС] 17
Ясно. Хм... Интересно большое спасибо

Добавлено через 6 минут
Как можно отправить несколько текстовых строк за один раз?
0
dir32
0 / 0 / 0
Регистрация: 18.07.2012
Сообщений: 16
13.07.2013, 03:44 18
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
program client;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Winsock;
 
type
Tclient = record
host : integer;
port : word;
end;
 
const
BUFLEN = 512;
PORT = 7777;
SRV_HOST ='drakon.hopto.org';
 
procedure vilet(s : string);
begin
writeln(s);
readln(s);
halt(0);
end;
 
function LookupHostAddr(const hn: string): string;
var
  h: PHostEnt;
begin
  Result := '';
  if hn <> '' then
  begin
    if hn[1] in ['0'..'9'] then
    begin
      if inet_addr(pchar(hn)) <> INADDR_NONE then
        Result := hn;
    end
    else
    begin
      h := gethostbyname(pchar(hn));
      if h <> nil then
        with h^ do
        Result := format('%d.%d.%d.%d', [ord(h_addr^[0]), ord(h_addr^[1]),
              ord(h_addr^[2]), ord(h_addr^[3])]);
    end;
  end
  else Result := '0.0.0.0';
end;
 
var
    si_other : sockaddr_in;
    s, i, j, n, l, slen : integer;
    este : boolean;
    buf : array[0..1024] of char;
    client, server : Tclient;
    peers : array[0..13] of TClient;
    wsdata : WSAData;
begin
    n:=0;
    slen:=sizeof(si_other);
     WSAStartup($0002, wsdata);
    s:=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if (s = INVALID_SOCKET) then
        vilet('error socket');
 
    FillChar(si_other, slen, 0);
    si_other.sin_family := AF_INET;
    si_other.sin_port := htons(PORT);
    si_other.sin_addr.s_addr := inet_addr(pchar(LookupHostAddr(SRV_HOST)));
 
    server.port := si_other.sin_port;
    server.host := si_other.sin_addr.s_addr;
    if (sendto(s, pchar('zdarow')^, 6, 0, si_other, slen)=SOCKET_ERROR) then
        vilet('error sendto');
 
    while true do
    begin
        l:=recvfrom(s,buf,sizeof(buf), 0, si_other, slen);
        if l=SOCKET_ERROR then vilet('error recvfrom'));
        if ((server.host = si_other.sin_addr.s_addr) and (server.port = si_other.sin_port)) then
         begin
         writeln('Paket ot sv ',inet_ntoa(si_other.sin_addr),':',ntohs(si_other.sin_port),'  ',pchar(@buf));
         if l mod 6 = 0 then
         for j:=0 to (l div 6)-1 do
         begin
         move(buf[j*6],client,6);
         este:=false;
         for i := 0 to n-1 do
         if ((peers[i].host = client.host) and (peers[i].port = client.port)) then este:=true;
         if not este then begin
                          peers[n].host := client.host;
                          peers[n].port := client.port;
                          inc(n);
                          si_other.sin_addr.s_addr := client.host;
                          si_other.sin_port := client.port;
                          writeln('Dobavlen peer ',inet_ntoa(si_other.sin_addr),':',ntohs(si_other.sin_port));
                          writeln('Nabralos ',n,' peerov');
                          if (sendto(s, pchar('zdarow')^, 6, 0, si_other, slen)=Socket_error) then vilet('error sendto');
                          end;
        end;
        end
        else  writeln('Datagrama ot peera ',inet_ntoa(si_other.sin_addr),':',ntohs(si_other.sin_port),'  ',pchar(@buf));
    FillChar(buf, SizeOf(buf), 0);
    end;
    closesocket(s);
end.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
program server;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Winsock;
 
type
Tclient = record
host : integer;
port : word;
end;
 
const
BUFLEN = 512;
PORT = 7777;
 
procedure vilet(s : string);
begin
writeln(s);
read(s);
halt(0);
end;
 
 
var
si_me, si_other : sockaddr_in;
s : TSocket;
i, slen : integer;
buf : array[0..BUFLEN] of char;
clients : array[0..13] of Tclient;
n : integer;
este : boolean;
wsdata : WSAData;
 
procedure sendpeerlist;
var sbuf : PChar;
l ,i : integer;
begin
l:=(n*6);      
getmem(sbuf,l);
for i:=0 to n-1 do move(pchar(@(clients[i]))[0],sbuf[i*6],6);
for i:=0 to n-1 do
        begin
        si_other.sin_addr.s_addr := clients[i].host;
        si_other.sin_port := clients[i].port;
        writeln('Otpravka k ', inet_ntoa(si_other.sin_addr),':',ntohs(si_other.sin_port),'  buf: ',sbuf);
        if (sendto(s,sbuf[0], l, 0, si_other, slen))= SOCKET_ERROR then vilet('error sendto');
        end;
freemem(sbuf);
end;
 
begin
slen:=sizeof(sockaddr_in);
n:=0;
WSAStartup($0002, wsdata);
s:=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s = INVALID_SOCKET) then vilet('error socket');
FillChar(si_me, slen, 0);
si_me.sin_family := AF_INET;
si_me.sin_port := htons(PORT);
si_me.sin_addr.s_addr := htonl(INADDR_ANY);
if (bind(s, si_me, slen))= SOCKET_ERROR then vilet('error bind');
while true do
   begin
   if recvfrom(s, buf[0], BUFLEN, 0, si_other, slen) = SOCKET_ERROR then vilet('error recvfrom');
   writeln('Polu4eno datagrama ot ', inet_ntoa(si_other.sin_addr),':',ntohs(si_other.sin_port),'  ',pchar(@buf));
   este:=false;
   for i := 0 to n-1 do
   if ((clients[i].host = si_other.sin_addr.s_addr) and (clients[i].port = si_other.sin_port)) then este:=true;
   if not este then begin
                    clients[n].host := si_other.sin_addr.s_addr;
                    clients[n].port := si_other.sin_port;
                    inc(n);
                    end;
    sendpeerlist;
    writeln('Nabralos ',n,' clientov');
   end;
   closesocket(s);
end.
Добавлено через 15 минут
вот пример punchinga.
сервер должен быть общедоступный
0
Anubis_
0 / 0 / 0
Регистрация: 04.07.2013
Сообщений: 29
13.07.2013, 10:22  [ТС] 19
:'( беда мне... А если клиентов три, и они одновременно отправили по 10 строк, это не будет выглядеть так:
-кл1
-кл3
-кл1
-кл2
-кл2
-кл1
-кл3
...
0
dir32
0 / 0 / 0
Регистрация: 18.07.2012
Сообщений: 16
13.07.2013, 13:03 20
Цитата Сообщение от Anubis_ Посмотреть сообщение
:'( беда мне... А если клиентов три, и они одновременно отправили по 10 строк, это не будет выглядеть так:
-кл1
-кл3
-кл1
-кл2
-кл2
-кл1
-кл3
...
нет.
отправка строками, даже если будешь отправлять таким образом :
for i:=0 to 9 do cl.socket.sendtext(a[i])
то получишь все 10 строк одновременно от конкретного клиента
0
13.07.2013, 13:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2013, 13:03

Dll и ClientSocket/ServerSocket
Есть клиентское приложение с Buttom, edit,label и clientsocket. Как сделать...

ServerSocket и ClientSocket Chat
Решил написать маленький чатик для общения по локальной сети на работе=) Но...

Проблемы с clientsocket и serversocket
Проблемы с их коннектом друг к другу! Ну чтобы нагляднее было возьмем в пример...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru