sockaddr_in - Programa de socket en C
server socket c++ (2)
Erm, como mínimo el ''& addr_len'' que pasó en sendto probablemente no debería haber sido pasado por la dirección: es decir, debería haber sido addr_len.
Ok, entonces estoy tratando de que funcione algún código UDP y apenas estoy verde cuando se trata de programación en red usando C. Estoy usando el archivo de muestra de aquí
Básicamente, estoy escuchando paquetes UDP entrantes en un puerto determinado y luego quiero enviar algunos datos de la misma manera. A continuación está la parte relevante.
En este punto, el socket está configurado y vinculado a un puerto de elección y espera los paquetes entrantes:
printf("GSProxy: waiting to recvfrom.../n");
addr_len = (socklen_t) sizeof their_addr;
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) { // argument 6 gives a warning but is correct int
perror("recvfrom");
exit(1);
}
printf("GSProxy: got packet from %s/n",
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr), s, sizeof s));
printf("GSProxy: packet is %d bytes long/n", numbytes);
buf[numbytes] = ''/0'';
printf("GSProxy: packet contains /"%s/"/n", buf);
char retmsg[] = "Hello!";
if ((numbytes = sendto(sockfd, retmsg, 7, 0,
(struct sockaddr *) &their_addr, &addr_len)) == -1) {
perror("GSPProxy: sendto");
exit(1);
}
printf("GSProxy: Sent %i bytes./n", numbytes);
Solo quiero enviar el "¡Hola!" cadena de vuelta al remitente.
Esto falla con el error " GSPProxy: sendto: File name too long
". ¿Cuál es el código de error [ENAMETOOLONG]? Hasta donde puedo decir.
Pero ... ¿qué significa **? ¿Qué archivo? ¿Qué es demasiado largo?
¿Es que no puedo reutilizar el socket para enviar datos, o acabo de cometer otro error newb?
Atentamente,
No debe pasar la dirección de la longitud de la estructura del conector a sendto()
; requiere la longitud real (es decir, "addr_len"
, no "&addr_len"
).
La razón por la que pasa la dirección de la longitud a recvfrom()
es que la función la cambia si la dirección real es más corta.
En otras palabras, reemplace:
if ((numbytes = sendto (sockfd, retmsg, 7, 0,
(struct sockaddr *) &their_addr, &addr_len)) == -1) {
con:
if ((numbytes = sendto (sockfd, retmsg, 7, 0,
(struct sockaddr *) &their_addr, addr_len)) == -1) {