Winsock UDP



  • Hallo 🙂

    Ich sende von einer Smartphone App aus, einen Strom von UDP Päckchen. Die ich am PC in einem cpp programm empfangen möchte.

    Ich hab so meine Probleme mit winsock. Mein Kompiler (VS 2010) sagt mir das er die funktion bind() nicht auflösen kann, dabei includiere ich den winsock2 header.

    hier der Code:

    #include <iostream>
    #include <WinSock2.h>
    
    int main(void)
    {	
    	struct sockaddr_in si_me;
    	int s, i, slen = sizeof(si_me);
    	char buf[256];
    
    	if((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    	{
    		std::cout << "err" << std::endl;
    		return -1;
    	}
    
    	memset((char*)&si_me, 0, sizeof(si_me));
    	si_me.sin_family		= AF_INET;
    	si_me.sin_port			= htons(5555);
    	si_me.sin_addr.s_addr	= htons(INADDR_ANY);
    	bind(s,(SOCKADDR*) &si_me, sizeof(si_me));
    
    	return 1;
    }
    


  • versuch mal die Ws2_32.lib hinzufügen

    #pragma comment( lib, "Ws2_32.lib" )
    


  • cool das wars!

    nur versteh ich jetzt nicht wieso er in Zeile 10 des selben Programms s = -1 bekommt. (also socket(); )
    was könnte dafür die Ursache sein?



  • Also i mach das in meinem Programm so:

    cout << "Creating Raw Socket..." << endl;
    sniffer = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    if ( sniffer == INVALID_SOCKET )
    {
       cout << "Failed to create Raw Socket!" << endl;
       return 1;
    }
    cout << "...Created" << endl;
    

    Nur SOCK_RAW ändern...



  • cl90 schrieb:

    nur versteh ich jetzt nicht wieso er in Zeile 10 des selben Programms s = -1 bekommt. (also socket(); )
    was könnte dafür die Ursache sein?

    Dass Du winsock nicht initialisiert hast ...



  • leider auch nicht..

    Liegt es Wifi?
    Ich erzähl mal ein bisschen mehr:
    Android Smartphone, verbunden auf einen Virtuellen Router der auf dem Notebook erzeugt wird. Das funktioniert auch soweit. Das Phone wird richtig erkannt.
    Ich mach das über den VRouter da ich sonst nicht weiß, wie ich mein Smatphone über wifi an das notebook bringen soll. Ad Hoc geht ja nicht.



  • Belli schrieb:

    cl90 schrieb:

    nur versteh ich jetzt nicht wieso er in Zeile 10 des selben Programms s = -1 bekommt. (also socket(); )
    was könnte dafür die Ursache sein?

    Dass Du winsock nicht initialisiert hast ...

    was genau soll ich denn initialisieren?

    WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    

    so?

    denn das funktioniert auch nicht. immer noch -1



  • cl90 schrieb:

    leider auch nicht..

    Wenn Dein oben gezeigtes Programm keinen Socket erzeugen kann, dann liegt das daran, dass Du winsock nicht initialisiert hast.

    NSDN sagt:
    "Alle Prozesse (Anwendungen oder DLLs), die Winsock-Funktionen aufrufen, müssen die Verwendung der Windows Sockets-DLL initialisieren, bevor sie andere Winsock-Funktionen aufrufen. Auf diese Weise wird außerdem sichergestellt, dass Winsock auf dem System unterstützt wird."



  • also WSAStartup() gibt mir 0 zurück.
    also fehlerlos. dann versteh ich jetzt noch weniger wieso socket() -1 zurückgibt...



  • Man kann doch sicher unter Winsock auch Fehlercodes auslesen? WSAGetLastError oder so.



  • Bashar schrieb:

    Man kann doch sicher unter Winsock auch Fehlercodes auslesen? WSAGetLastError oder so.

    danke! hat mich auf 10022 geführt... Falsche parameter an socket übergeben.
    Hatte noch AF_UNSPEC etc vom rumtesten in der socket funktion.

    jetzt wieder auf den alten werten gehts.
    es hat also vorher an der Initialisierung gelegen. So wie du gesagt hast.
    Vielen Dank 🙂



  • So ich hab jetzt auch die ersten Daten erfolgreich vom Smartphone empfangen.
    Für die Leute die wie ich gerne mal Foren durchsuche:

    #include <iostream>
    #include <WinSock2.h>
    #include <AF_Irda.h>
    #pragma comment(lib, "Ws2_32.lib")
    //#include <Winineti.h>
    //#include <sys/types.h>
    
    using namespace std;
    
    int main(void)
    {
    	cout << "creating raw socket..." << endl;
    
    	struct sockaddr_in si_me;
    	sockaddr_in SenderAddr;
    	int SenderAddrSize = sizeof(SenderAddr);
    
    	int s, i, slen = sizeof(si_me);
    	char buf[256];
    
    	WSADATA wsaData;// = {0};
    	int rs = WSAStartup(MAKEWORD(2, 2), &wsaData);
    	if(rs != 0)
    	{
    		cout << "fehlercode: " << rs << endl;
    		return -1;
    	}
    
    	s = INVALID_SOCKET;
    	if((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
    	{
    		cout << "errcode: " << WSAGetLastError() << endl;
    		return -1;
    	}
    
    	memset((char*)&si_me, 0, sizeof(si_me));
    	si_me.sin_family		= AF_INET;
    	si_me.sin_port			= htons(5555);
    	si_me.sin_addr.s_addr	= htons(INADDR_ANY);
    	rs = bind(s,(SOCKADDR*) &si_me, sizeof(si_me));
    	if(rs != 0)
    	{
    		cout << "errcode: " << WSAGetLastError() << endl;
    		return -1;
    	}
    
    	cout << "reading" << endl;
    
    	rs = recvfrom(s, buf, 256, 0, (SOCKADDR*) &SenderAddr, &SenderAddrSize); 
    	if(rs = SOCKET_ERROR)
    	{
    		cout << "errcode: " << WSAGetLastError() << endl;
    		return -1;
    	}
    
    	system("Pause");
    	return 1;
    }
    

    Danke an alle Antworten von euch 🙂


Anmelden zum Antworten