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