Komisches Problem mit nem Socket
-
ich kienn jetzt leidfer nich den Unterschied zwischen AF_INET und PF_INET aber daran liegt es hoffe ich mal nich, muss gleich mal nachlesen.
das andere SOCK_STREAM ist ja für TCP Verbiundungen und SOCK_DGRAM ist für UDP Verbindungen. Eigentlich sollte das ja so korrekt sein.
oder was meinst du??
Nochmal zu deiner Zusammenfassung:
In der Mainfunktion wird ein Port geöffnet und Clients können sich verbinden.In der WarteAufServer Funktion SOLLTE ein Port geöffnet werden. Tut es aber NICHT weder auf UDP noch auf TCP Basis!!
-
snoopdog schrieb:
das andere SOCK_STREAM ist ja für TCP Verbiundungen und SOCK_DGRAM ist für UDP Verbindungen. Eigentlich sollte das ja so korrekt sein.
Eigentlich schon, nur hab ich mich mit UDP noch nicht beschäftigt. Soweit ich mir den TCP teil angeschaut habe sollte der aber ansonsten OK sein.
-
ja dasist ja das Problem an der Sache. Für mich ist der Code auch korrekt nur leider funktioniert es ja nicht.. was mich sehr sehr wundert...
Ob ich nun TCP als Verbindungsart oder UDP nutze ist mir eigneltich schnuppe, jedenfalls in dem Fall.
-
Der Port den du öffnest wird als "mps-raft" in netstat angezeigt!!!
Ich hab alles mal ein bisschen umgeschrieben, bis ich darauf gekommen bin. Ich hab dann den port geändert.
#include <cstdlib> #include <stdio.h> #include <unistd.h> #include <syslog.h> #include <sys/types.h> #include <netinet/in.h> #include <string.h> #include <sys/socket.h> #include <sys/select.h> #include <pthread.h> #define DPORT 4325 class CMySocket { public: CMySocket(bool TCP); int CreateServer(bool TCP,int Port); int ServerSocket; struct sockaddr_in addr; socklen_t addr_len; }; CMySocket::CMySocket(bool TCP) { if(TCP==true) { ServerSocket = socket(PF_INET,SOCK_STREAM,0); printf("TCP Socket created!\n" ); } else { ServerSocket = socket(PF_INET,SOCK_DGRAM,0); printf("UDP Socket created!\n" ); } } int CMySocket::CreateServer(bool TCP,int Port) { int rc; addr.sin_family = AF_INET; addr.sin_port = htons( Port ); addr.sin_addr.s_addr=INADDR_ANY; addr_len = sizeof(addr); rc = bind(ServerSocket,(struct sockaddr*)&addr,sizeof(addr)); if(rc==0) { printf("Erfolgreich gebunden\n"); } else { printf("Nicht erfolgreich gebunden\n"); } if(TCP==true) { rc = listen(ServerSocket,1); if(rc!=0) { perror("Fehler beim listen\n"); } else { printf("Server listen....\n"); } } return 1; } //Main.h // Main Gameserver Klasse void *WarteAufGameServer(void *name) { CMySocket *pSocket; pSocket = new CMySocket(true); char buffer[200]; int rc; int neuer_socket; struct sockaddr_in remoteaddr; socklen_t len=sizeof(remoteaddr); pSocket->CreateServer(true, DPORT); printf("1\n"); struct sockaddr_in accept_addr; int accept_addr_len = sizeof( accept_addr ); neuer_socket = accept(pSocket->ServerSocket, (struct sockaddr*)&accept_addr, (socklen_t*)&accept_addr_len); printf("Connetion\n"); printf("1,5\n"); //while(1) { printf("2\n"); //rc = pSocket->SocketRecv(buffer,200,neuer_socket); rc = recvfrom(pSocket->ServerSocket,buffer,200,0,(struct sockaddr*)&remoteaddr,&len); printf("%s\n",buffer); } } int main() { pthread_t WarteAufServer; pthread_create(&WarteAufServer,NULL,WarteAufGameServer,(void *)"hallo"); while(1); return 0; }
-
öhm werde ich morgen inner mittagspause mal testen, bin jetzt zu müde...
Soweit ich das auf dem ersten Blick erkenne hast du parameter 2 und 3 von der funktion accept besetzt. Hm kann es daran liegen? in meiner MainFunktion habe ich Parameter 2 und 3 ja auch auf NULL stehen.
was mir noch aufgefallen ist, warum hast du die while(1) in der WarteAufGameServer auskommentiert? Somit wird ja nur einmal recvfrom aufgerufen und sobald der einmal eine Nachricht bekommt wurd der Thread beendet. er sollte jedoch pausenlos im Hintergrund mitlaufen und áuf Nachrichten warten.
Aber danke schonmal
-
Das while hatte ich nur zum Testen auskommentiert. Ich glaube aber, dass dein code schon die ganze Zeit funktioniert hat, nur du hast das nicht bemerkt, weil der Port 1700 schon von für ein bestimmtes Protokoll vorgesehen war(s.o.), welches in netstat angezeigt wurde, statt port 1700.
-
hm. aber am port kann es eigentlich nich gelegen habe, habe auch schon andere ports ausprobiert.. 200 und 1601.. .und bei beiden ging es nicht.. naja werd ich nacher mal testten.
-
ok habs getestet und klappt, sogar mit port 1600. irgendwie komisch das der nich bei nmap angezeigt wird...
wenn ich in der commandline netstat eingebe zeigt der mir ja sämtlcihe offen ports an, aber weder port 1600(TCP) noch 1600(UDP) wie kommt das ?
welchen parameter hast du netstat mitgegeben ??
-
ich dachte, es wäre jetzt geklärt? (siehe "anderes" forum
)
wie gesagt, ein portscan hätte es dir auch gezeigt.
-
das ist es ja nen portscan hat es mir nicht angezeigt.
nmap localhost hat mir lediglich den TCP Port 1600 in der MainFunktion angezeigt.
ein nmap -sU localhost als root ausgeführt hat mir nur einen UDP Port angezeigt(111) aber nich meinen 1600(UDP)