eigenen Port ermitteln
-
Hallo,
ich habe einen Socket eröffnet alles soweit ok.
Nun schicke ich ein Telegramm an einen mir fremden Server.
Dieser antwortet mir leider nur auf einen Port welchem ich ihm vorher
in dem Telegramm mitteilen muss.
Wie bekommen ich meinen zugewiesen Port raus?
ich arbeite mit winsocket.Danke Holger
-
sentinel.dd schrieb:
Nun schicke ich ein Telegramm an einen mir fremden Server.
Hier geht es also im UDP ?
sentinel.dd schrieb:
Wie bekommen ich meinen zugewiesen Port raus?
In der MSDN steht folgendes
The recvfrom function reads incoming data on both connected and unconnected sockets and captures the address from which the data was sent. This function is typically used with connectionless sockets. The local address of the socket must be known. For server applications, this is usually done explicitly through bind. Explicit binding is discouraged for client applications. For client applications using this function, the socket can become bound implicitly to a local address through sendto, WSASendTo, or WSAJoinLeaf.
Entweder dein Programm ist ein Server, dann hast du mit bind selber einen Port vergeben und ihn dir gemerkt.
Beim Client deutet obiges Zitat darauf hin, das die Bindung erst beim ersten Senden erfolgt. Sicher bin ich da aber nicht.
Auslesen kann man die Bindung jedenfalls mit getsockopt. Da steht bei SO_BSP_STATE
Returns the local address, local port, remote address, remote port, socket type, and protocol used by a socket.
-
so ich habe mich mal durch das Forum gewühlt und eigentlich sollte ich doch
mittels getservbyport den Port bekommen.
Leider bekomme ich nur die Fehlermeldung WSANO_DATA 11004.
Das senden klappt - ich sehe im Wireshark ja den Port welchen ich zugewiesen bekomme.
Ich brauch aber unbedingt vor dem Senden den Port.
Oder kann man den auch expliziet fest vorgeben. (Auf die Gefahr hin, dass dieser schon belegt ist)
Anbei die FunktionUINT startup(LPVOID pParam) { CEibDlg *pLC = (CEibDlg*) pParam; struct servent *serv; long rc; long prc; unsigned short n_port; TCHAR szError[100]; port="3671"; ip_adr="192.168.178.28"; trace.Input("Verbindung zum KNX wird aufgebaut.."); S=socket(AF_INET,SOCK_DGRAM,0); addr.sin_family=AF_INET; u_short port_char; port_char=atoi(port); addr.sin_port=htons(port_char); char ip_char[16]; strcpy_s(ip_char,ip_adr); addr.sin_addr.s_addr=inet_addr(ip_char); serv = getservbyport(htons(port_char), 0); if (serv == 0) // ich lande immer hier { wsprintf (szError, TEXT("Serv Error: %d"),WSAGetLastError()); trace.Input(szError); } else { //eigener port? new_port = ntohs(serv->s_port); wsprintf (szError, TEXT("Port: %d"),new_port); trace.Input(szError); } if(S==INVALID_SOCKET) { wsprintf (szError, TEXT("Socket Error: %d"),WSAGetLastError()); trace.Input(_T("Fehler: Der KNX Socket konnte nicht erstellt werden")); trace.Input(szError); } else { wsprintf (szError, TEXT("KNX Socket erstellt! Port: %d"),new_port); trace.Input(szError); //AfxBeginThread(knx_receive,pLC); //knx empfang trace.Input(_T("Sende Connect Request")); // Connect Request pLC->knx_send("06100205001A0801C0A8B2160EEC0801C0A8B2160EEC04040200"); // Device Configuration Requeste //pLC->knx_send("061003100011041D0000FC000001531001"); } return 0; }
Danke Holger
-
sentinel.dd schrieb:
Oder kann man den auch expliziet fest vorgeben.
Wenn du nicht liest, was dir geantwortet wird, warum fragst du überhaupt ?
-
dann bin ich wohl zu blöd das zu erkennen.
Wenn ich das richtig verstehe bekomme ich das mit bind raus.
Nur ich bin doch ein Client und binde mich nicht an einen port.
ich verstehe nicht wieso die funktion getservbyport nicht klappt.
Ich will ja den port vom OS nehmen nur komme ich nicht dran.Holger
-
sentinel.dd schrieb:
Wenn ich das richtig verstehe bekomme ich das mit bind raus.
Mit bind legst du den Port fest. Von der Programmlogik her wirst du damit quasi zum Server, bei UDP sind die Rollen von Client und Server nicht so eindeutig.
Du kannst auch einen zweiten Socket verwenden, den du an einen Port bindest. Dann nimmst du einen Serversocket zum Lesen und einen Clientsocket zum Schreiben. Wenn beides unabhängig passiert, z.B. in zwei Threads könnte das sogar sehr günstig sein.
sentinel.dd schrieb:
ich verstehe nicht wieso die funktion getservbyport nicht klappt.
Ich will ja den port vom OS nehmen nur komme ich nicht dran.Das liegt daran, dass beim normalen Client der Port vom OS erst beim ersten Senden festgelegt wird.
-
vielen Dank - mit bind klappts nun.
ist echt schwer bei udp server/client zu trennen.Danke Holger