Ich weiß nicht, wie Sie Ihren UDP-Server bauen, aber ich denke, etwas stimmt nicht damit. Ich schreibe ein Beispielprogramm, um die Fehlermeldung erklären Sie bekommen:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct sockaddr_in addr;
int fd, cnt, ret;
if ((fd=socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("error");
exit(1);
}
memset(&addr, 0, sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
addr.sin_port=htons(9090); // address which is not bound
ret = connect(fd,(struct sockaddr *)&addr,sizeof(addr));
char buf[512];
cnt = send(fd, "hello", sizeof("hello"), 0);
if(cnt < 0)
perror("send:");
cnt = recv(fd, buf, 512, 0); // error: Connection refused
if(cnt < 0)
perror("recv:");
return 0;
}
Ich versuche, Daten an den UDP-Port 9090 senden an localhost oder einem Host, der keine UDP-Socket an Port 9090 gebunden ist, die send()
gelingt aber die recv()
schlägt fehl. Nach man page for udp:
All fatal errors will be passed to the user as an error return even when the socket is not connected. This includes asynchronous errors received from the network. You may get an error for an earlier packet that was sent on the same socket. This behaviour differs from many other BSD socket implementations which don't pass any errors unless the socket is connected. Linux's behaviour is mandated by According to the rfc 1122
die sagt:
UDP MUST pass to the application layer all ICMP error messages that it receives from the IP layer. Conceptually at least, this may be accomplished with an upcall to the ERROR_REPORT routine
die send()
erfolgreich ist, aber es verursacht Nachricht ein ICMP-Fehler (Sie es mit tcpdump sehen), dann recv()
sieht diesen Fehler (Sie können einen Fehler für ein früheres Paket erhalten, das auf dem gleichen Socket gesendet wurde), so dass es fehlschlägt.
@EJP Es ist möglich -> http://stackoverflow.com/questions/34224443/an-existing-connection-was-forciblen-closed-by-the-remote-host-when-listening-f – leon22
Können Sie Bitte vergewissern Sie sich, dass dort ein UDP-Socket an den Port '20100' gebunden ist? Wenn bei einem verbundenen UDP-Socket nach dem Aufruf von 'send()' kein Empfänger an der Zieladresse ist, können nachfolgende Aufrufe von 'send()' und 'receive()' mit 'ECONNREFUSED' fehlschlagen. –
@TannerSansbury Wie kann ich dies überprüfen? (Wenn ich TCP-Sockets verwende, habe ich keine Probleme, muss aber aus Gründen der Geschwindigkeit zu UDP wechseln) – leon22