Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.05.2007, 21:21

WinSocket: Server nur im localem Netzwerk?

Hallo!
Ich habe probier einfach mal ein kleinen chat zu schreiben
Auf meinem PC (also local) klappt das super
Doch leider geht das nicht über das internet.
Hab es meinem Freund geschickt und ausprobiert.
klappt nicht :(
Geht das grundsätzlich nicht oder mach ich was falsch?

Gruß Flo

Hier mal die Klasse "CVerbindung":

C-/C++-Quelltext

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
//===================

//===Verbindung.h====

//Von Florian Renneke

//===================

//=====2.Mai.2007====

//===================


//.........includes............

#include <winsock2.h> 
//.........includes............


//........namespace............

using namespace std;
//........namespace............


//........defines..............

#define SERVER 101
#define CLIENT 102
#define ADMIN 103
#define USER 104
//........defines..............




//===========================Verbindung-Klasse==================================

class CVerbindung
{

private: WSADATA Data;

         SOCKET AcceptSocket, Socket;
         SOCKADDR_IN Admin, Client;
         
         char buf[256];
         char *serverIP;
         

public: CVerbindung();
        bool open(int typ, int Port, char *IP);
        bool wait();
        bool senden(char* message, int empfaenger);
        char* get(int sender);
        char* Ahostname();
        ~CVerbindung();

};
//===========================Verbindung-Klasse==================================






//----------------------------Hostname bekommen---------------------------------

char* CVerbindung::Ahostname()
{
memset(&buf,0,sizeof(buf));

PHOSTENT hostinfo; 

gethostname ( buf, sizeof(buf));
hostinfo = gethostbyname(buf);


serverIP = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);


return serverIP;
}
//----------------------------Hostname bekommen---------------------------------





//----------------------------Initalisierung------------------------------------

CVerbindung::CVerbindung()
{
WSAStartup(MAKEWORD(2,0),&Data);                      
}
//----------------------------Initalisierung------------------------------------












//----------------------------Alles Löschen-------------------------------------

CVerbindung::~CVerbindung()
{
WSACleanup();    
}
//----------------------------Alles Löschen-------------------------------------











//----------------------------Verbindung herstellen-----------------------------

bool CVerbindung::open(int typ, int Port, char IP[50]="server")
{

if(typ==CLIENT)
{
//.........Client einloggen auf einen server............

Socket=socket(AF_INET,SOCK_STREAM,0);

if (Socket==INVALID_SOCKET)
return false;

memset(&Admin,0,sizeof(SOCKADDR_IN));
Admin.sin_family=AF_INET;
Admin.sin_port=htons(Port);
Admin.sin_addr.s_addr=inet_addr(IP);

if(connect( Socket , (SOCKADDR*)& Admin , sizeof(SOCKADDR) )==SOCKET_ERROR)
return false;
//.........Client einloggen auf einen server............

}
else if (typ==SERVER)
{
//........Server erstellen.........................


AcceptSocket=socket(AF_INET,SOCK_STREAM,0);

if(AcceptSocket==INVALID_SOCKET)
return false;


Admin.sin_family=AF_INET;
Admin.sin_port=htons(Port);
Admin.sin_addr.s_addr=INADDR_ANY;

if(bind(AcceptSocket,(SOCKADDR*)&Admin,sizeof(Admin))==SOCKET_ERROR)
return false;

//........Server erstellen.........................

}    

return true;     
}
//----------------------------Verbindung herstellen-----------------------------











//-------------------------------Auf client warten------------------------------

bool CVerbindung::wait()
{

if(listen(AcceptSocket,10)==SOCKET_ERROR)
return false;

Socket = accept (AcceptSocket, NULL, NULL);

return true;     
}
//-------------------------------Auf client warten------------------------------









//----------------------------Message senden------------------------------------

bool CVerbindung::senden(char* message, int empfaenger)
{

if (empfaenger==CLIENT)
{

if(sendto(Socket,message,strlen(message),0,(SOCKADDR*)&Client,(int) sizeof(SOCKADDR_IN))
==SOCKET_ERROR)
return false;

}
else if (empfaenger==ADMIN)
{

if(send(Socket,message,strlen(message),0)==SOCKET_ERROR)
return false;

}
 
return true;                                                                    //Alles lief gut!    

}
//----------------------------Message senden------------------------------------
















//---------------------------Message empfangen----------------------------------

char* CVerbindung::get(int sender)
{
memset(&buf,0,sizeof(buf));

if (sender==ADMIN)
{


if(recvfrom(Socket,buf,256,0, (SOCKADDR*)&Admin, (int*) sizeof(SOCKADDR_IN))==SOCKET_ERROR)
return false;

}
else if (sender==CLIENT)
{

if(recvfrom(Socket,buf,256,0,(SOCKADDR*)&Client, (int*) sizeof(SOCKADDR_IN))==SOCKET_ERROR)
return false;

}


return buf;
}
//---------------------------Message empfangen----------------------------------

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

03.05.2007, 21:30

Vielleicht falsche IP angegeben? Vielleicht falschen Port? Hat er ne Firewall, nen Router vor seinem PC, ...

Fragen über Fragen! :) Wär schön wenn du dein Problem etwas spezifizieren könntest.
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

03.05.2007, 21:54

Erstmal grundlegendes:

Trenn den Servercode klar vom Clientcode. Ähnliche Methoden usw. kannst du in eine abstrakte Klasse(z.b. Netzwerk) auslagern von der dann sowohl der Server als auch der Client erben.

Also IP/Host zu dem sich der Client connecten soll gibst du

char IP[50]="server"

an. Das geht aber halt nur im lokalen Netz. Im Inet gibt es sicher verdammt viele Rechner mit dem Namen "server". Woher soll er also wissen wen du meinst ;) . Du kannst DNS Namen nutzen (z.B. DynDns) oder Adressen wie "www.web.de" oder eben direkt die IP Adresse im Netz. Wenn der Server hinter einem Router sitzt, muss man außerdem den Port aus dem Inet ins lokale Netz umleiten (Stichworte: Port forwarding und NAT).

Auch kannst du dir mal den Befehl select anschauen. Der macht es möglich, dass der Server einseits weiterhin Clients empfangen und andererseits Nachrichten von den Clients verarbeiten kann.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

03.05.2007, 22:13

Du verwurstelst da ein paar Dinge ganz schön. Nur mal so interessenshalber:

:arrow: DNS Namen: Weithin auch bekannt unter dem Kürzel FQDN, was auch deine "Adresse" mit einbeschließt. Beides wird aber per DNS (Domain Name System) in eine IP Adresse aufgelöst.
:arrow: Port forwarding und NAT: Was meintest du nun? PAT oder NAT? ;)
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

03.05.2007, 23:10

Ahhhlso. Wenn du das Bedürfnis hast, mir jetzt die begriffliche Unsauberkeit nach tragen zu wollen bitte sehr ;)

Port forwarding läuft bei mir unter dem Überbegriff NAT. Aber egal wie hinauslaufen tut es auf das hier: http://de.wikipedia.org/wiki/Port_Forwarding

Klar ist www.web.de eine DNS Adresse genauso wie nox-7bitfaster.dyndns.org aber ändert das jetzt großartig den Inhalt der Aussage? :roll:

Außerdem brummt mir der Kopf, was u.a. mit Netzwerkprogrammierung (aber eigentlich eher Multithreading) zu tun hat, daher bitte ich darum gewisse Überschreitungen der Tolleranzwerte zu verzeihen ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

04.05.2007, 00:24

Yo, dir sei verziehen. ;) Aber: http://en.wikipedia.org/wiki/Port_address_translation.

grüße
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

04.05.2007, 16:58

Zitat

Relationship between NAT and PAT
PAT is closely related to the concept of Network Address Translation, often called NAT. Similar to NAT, port translation makes changes to the sender’s address or recipient’s address on data packets. However, any IP address change involves the PAT device’s outside IP address rather than a pool of addresses as in NAT.

PAT translates both the IP and port fields -- wherever those values belong to an internal host. Port numbers on packets coming from the external network, rather than destination IP addresses, are used to identify and designate traffic to different computers on the inside network.


*blub* irgendwie sehe ich das "aber" nicht :) Liegt aber vielleicht an meinem schlechten Englisch :oops:
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

04.05.2007, 17:13

Dann nochmal auf deutsch! ;)

Zitat von »"de.wikipedia.org"«


Port Address Translation (PAT) oder Network Address Port Translation (NPAT) ist eine Technik, die in Computernetzwerken verwendet wird. Sie ist eine spezielle Form von NAT. Dabei werden im Gegensatz zu NAT nicht nur die IP-Adressen, sondern auch Port-Nummern umgeschrieben.


Mit anderen Worten: Port forwarding! ;-)
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

04.05.2007, 18:43

@David_pb: scho klar, aber macht es jetzt den großen Unterschied für den Programmierer? Aber egal, wir verlieren uns hier meiner Meinung nach in "Kleinigkeiten" ;)

@F-Wölkchen: Wieder zurück zu deinem Problem. Haben wir dir helfen können oder hängst du noch irgendwo?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

10

04.05.2007, 21:33

Hmm.
Also ich schreibe dann noch mal die klasse (zwei klassen) neu.
Also was für eine IP brauche ich dann?
Hier mal ein paar beipsiele:

1) 192.168.2.101
2) 256.123.2.120:2701
3) 5.154.95.187

Also Nr. 3) klappt auch! Nr. 2) nicht wirklich Nr.1) kann eingentlich sein weil das doch die lokale adresse ist (oder?) .

Gruß Flo

Werbeanzeige