[YBA] When does write to UDP socket block?

[YBA] When does write to UDP socket block?

Amos Shapira amos.shapira at gmail.com
Wed Mar 7 09:22:21 IST 2012


Even select can't guarantee against blocked write since other events can
fill them up.
On Mar 7, 2012 5:03 PM, "Shachar Shemesh" <shachar at shemesh.biz> wrote:

>  On 03/07/2012 07:27 AM, Jonathan Ben Avraham wrote:
>
> Hi linux-il colleagues,
> In >= 2.6.31 are there any conditions under which a write to a connected
> UDP socket can block? e.g. some change in routing or iface config after
> connect and before write? Has anyone encountered a concrete exampe of a
> write to a UDP socket that blocks? See test code below. That is, I am
> trying to demonstrate that I can get to a situation where UDP write in fact
> does block.
> Best regards,
>
>
> A UDP (or, for that matter, TCP) socket will block under only one
> situation that I'm aware of: if the send buffers are full. Use select to
> test whether you can write to it, just like you would any other file
> descriptor.
>
> One area where this actually works is cellular modems. If you are
> transmitting over your bandwidth, sooner or later the socket will block.
>
> As for the program below: are you sure it doesn't block?
>
> Shachar
>
>
>  - yba
>
>
> #include <stdio.h>
> #include <strings.h>
> #include <sys/socket.h>
> #include <sys/types.h>
> #include <netinet/in.h>
> #include <net/if.h>
> #include <stdlib.h>
> #include <errno.h>
>
>
> int main()
> {
>         int sd;
>         int rc;
>         struct ifreq interface;
>         struct sockaddr_in sin;
>         unsigned char buf[1024];
>         struct sockaddr_in  serveraddr;
>
>         if (0 > (sd = socket(AF_INET, SOCK_DGRAM, 0))) {
>                 printf("socket failed\n");
>                 exit(1);
>         }
>
>         sin.sin_family = AF_INET;
>         sin.sin_port = htons(0);
>         bzero(&(sin.sin_zero), 8);
>
>         sin.sin_addr.s_addr = INADDR_ANY;
>
>         if (-1 == bind(sd, (struct sockaddr *)&sin, sizeof(struct
> sockaddr_in))) {
>                 printf("bind to sd failed [%m]");
>                 return -1;
>         }
>
>
>         bzero(&serveraddr, sizeof(struct sockaddr_in));
>         serveraddr.sin_family = AF_INET;
>         serveraddr.sin_port = htons(80);
>         inet_pton(AF_INET, "1.0.1.2", &serveraddr.sin_addr);
>
>         if (0 > (rc = connect(sd, (const struct sockaddr*)&serveraddr,
> sizeof(serveraddr)))) {
>                 printf("connect failed [%m]");
>                 exit(1);
>         }
>
>         while ( 1 ) {
>                 if (0 > (rc = write(sd, buf, 1024))) {
>                         printf("write error [%m]\n");
>                 }
>                 else
>                         printf("wrote to socket [%d]\n", rc);
>         }
> }
>
>
>
>
> --
> Shachar Shemesh
> Lingnu Open Source Consulting Ltd.http://www.lingnu.com
>
>
> _______________________________________________
> Linux-il mailing list
> Linux-il at cs.huji.ac.il
> http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.cs.huji.ac.il/pipermail/linux-il/attachments/20120307/8cd0b374/attachment.html>


More information about the Linux-il mailing list