www.mikrocontroller.net

Forum: PC-Programmierung udp Programm lässt sich nicht linken


Autor: Bug (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich hab mir unter Microsoft Visual Studio C++ 2008 ein UDP Client 
Programm geschrieben. Sobald ich das Programm ausführen möchte, 
erscheinen meherer Linker Fehler:
1>udp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0" in Funktion "_wmain".
1>udp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__socket@12" in Funktion "_wmain".
1>udp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAStartup@8" in Funktion ""int __cdecl startWinsock(void)" (?startWinsock@@YAHXZ)".
1>C:\UDP\udp\Debug\udp.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wichtigstes Zitat daraus:

   Ensure that the build environment links to the Winsock
   Library file WS2_32.lib. Applications that use Winsock
   must be linked with the WS2_32.lib library file.

Also muss diese Library in den Projekteinstellungen als zusätzlich zu 
verwendende Library aufgeführt werden.

Alternativ kann man bei Microsoft-Compilern auch sowas machen:

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

(in einem Sourcefile des Projekts unterbringen)

Autor: Bug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Hat sich somit erledigt.

Autor: Bug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab bezüglich UDP noch eine Frage. Wie kann man dem UDP Socket sagen, 
dass ich die andere Netzwerkkarte verwenden möchte? Ist dies 
einstellbar?

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bug schrieb:
> Hab bezüglich UDP noch eine Frage. Wie kann man dem UDP Socket sagen,
> dass ich die andere Netzwerkkarte verwenden möchte? Ist dies
> einstellbar?

Als "Absender"  die IP der anderen Netzwerkkarte auswählen, das Routing 
macht den Rest.

Autor: Bug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann nur die Empfangsadresse einstellen.
  addr.sin_family=AF_INET; 
  addr.sin_port=htons(5555); 
  addr.sin_addr.s_addr=inet_addr("192.167.1.9"); 

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich kann nur die Empfangsadresse einstellen.

Wenn du kein bind() machst, vergibt er lokale Adresse und Port 
automatisch. Aber das ist dafür egal. Das Routing kümmert sich anhand 
der Zieladresse schon automatisch darum, das da rauszuschicken, wo es 
hingehört.

Autor: Bug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist mein Code für das Empfangen.

void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
  if (p != NULL) 
  {
    udp_sendto(pcb, p, addr, port)/
    
    pbuf_free(p);
  }
}


void recvUDP(void)
{
    struct ip_addr ipaddr;
    struct udp_pcb *pcb;
    struct pbuf *pb;
    IP4_ADDR(&ipaddr, 192,167,1,9); // Zielrechner

    pcb = udp_new();
    udp_bind(pcb, IP_ADDR_ANY, 5555);

    udp_connect(pcb, &ipaddr, 5555);
    udp_recv(pcb, udp_echo_recv, NULL);
}

Autor: Bug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf der PC Seite habe ich mal mit C++ eine Beispielapplikation erstellt.
Mit dieser sende ich alle paar Millisekunden ein UDP-Packet. Mein PC 
besitzt zwei Netzwerkkarten. Das Empfangsmodul ist ein Mikrocontroller 
mit einer Ethernet Schnittstelle. Jetzt weiss halt nicht genau wo man 
auf der PC-Seite auswählen kann auf welche Netzwerkkarte die Nachrichten 
versendet werden sollen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schlag doch mal die Doku zu udp_bind() und speziell zu deinem 
verwendeten Parameter IP_ADDR_ANY nach.

z.B. hier
http://www.ecoscentric.com/ecospro/doc.cgi/html/ec...

An der Stelle in udp_bind() kann auch was anderes stehen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Jetzt weiss halt nicht genau wo man auf der PC-Seite auswählen kann auf
> welche Netzwerkkarte die Nachrichten versendet werden sollen.

Das wählst du über die der Karte über das Betriebssystem zugewiesene 
IP-Adresse und Netzmaske aus.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.