select, sendto and ENOBUFS

Julian Elischer julian at elischer.org
Tue Feb 10 11:11:32 PST 2004



On Tue, 10 Feb 2004, Andrew wrote:

> Hi,
> 
> I have a problem with sendto returning an error and setting errno to
> ENOBUFS however I am calling select first to make sure the fd is
> writeable (see below for code). s is a raw socket and the data I'm
> sending is 1492 bytes. I haven't changed the low water mark for the
> socket.
> 
> This looks like a bug however the bug may well be mine...
> 
> Does anyone have any ideas?
> 
> Thanks,


This is not a bug

select says "yes there is room inm the socket buffer"
however datagram protocols do not store anythign in the outgoing socket
buffer, but, instead hand the packets directly to the driver for the
NIC.

when the NIC fils up it returns ENOBUFS

this is your cue to do a usleep(1000)
before sending more packets.
> 
> Andrew
> 
> do {
>     printf("waiting on socket\n");
>     FD_ZERO(&fdset);
>     FD_SET(s, &fdset);
>     if (select(s + 1, NULL, &fdset, NULL, NULL) == -1) {
>         warn("select");
>         return 0;
>     }
> } while (! FD_ISSET(s, &fdset));
> printf("socket ready\n");
> 
> if (se$ndto(s, (void *)ip_packet, ip_packet->ip_len, 0, (struct sockaddr
> *)&sa, sizeof(sa)) == -1) {
>     if (errno == ENOBUFS) {
>         warn("sleeping 1 second - sendto");
>         sleep(1);
>     } else {
>         warn("sendto");
>     }
>     return 0;
> }
> 
> 
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
> 



More information about the freebsd-hackers mailing list