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


von Bug (Gast)


Angehängte Dateien:

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
1>udp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0" in Funktion "_wmain".
2
1>udp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__socket@12" in Funktion "_wmain".
3
1>udp.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__WSAStartup@8" in Funktion ""int __cdecl startWinsock(void)" (?startWinsock@@YAHXZ)".
4
1>C:\UDP\udp\Debug\udp.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

von ... .. (docean) Benutzerseite


Lesenswert?


von Rufus Τ. F. (rufus) Benutzerseite


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)

von Bug (Gast)


Lesenswert?

Danke! Hat sich somit erledigt.

von Bug (Gast)


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?

von Εrnst B. (ernst)


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.

von Bug (Gast)


Lesenswert?

Ich kann nur die Empfangsadresse einstellen.
1
  addr.sin_family=AF_INET; 
2
  addr.sin_port=htons(5555); 
3
  addr.sin_addr.s_addr=inet_addr("192.167.1.9");

von Rolf Magnus (Gast)


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.

von Bug (Gast)


Lesenswert?

Das ist mein Code für das Empfangen.
1
void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
2
{
3
  if (p != NULL) 
4
  {
5
    udp_sendto(pcb, p, addr, port)/
6
    
7
    pbuf_free(p);
8
  }
9
}
10
11
12
void recvUDP(void)
13
{
14
    struct ip_addr ipaddr;
15
    struct udp_pcb *pcb;
16
    struct pbuf *pb;
17
    IP4_ADDR(&ipaddr, 192,167,1,9); // Zielrechner
18
19
    pcb = udp_new();
20
    udp_bind(pcb, IP_ADDR_ANY, 5555);
21
22
    udp_connect(pcb, &ipaddr, 5555);
23
    udp_recv(pcb, udp_echo_recv, NULL);
24
}

von Bug (Gast)


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.

von Stefan B. (stefan) Benutzerseite


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/ecospro-ref/lwip-api-raw-udp.html

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

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.