From d035d4d51e71c3355972682a815ab2b35e5f0ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 7 Apr 2010 14:24:00 +0000 Subject: sender now optionally uses sendto() if the chunk has an address/port specified, sendto() is used; else the default send() on the socket is used svn path=/trunk/externals/iem/iemnet/; revision=13390 --- iemnet_sender.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/iemnet_sender.c b/iemnet_sender.c index a45ae10..552f133 100644 --- a/iemnet_sender.c +++ b/iemnet_sender.c @@ -47,14 +47,28 @@ struct _iemnet_sender { /* the workhorse of the family */ static int iemnet__sender_dosend(int sockfd, t_iemnet_queue*q) { + struct sockaddr_in to; + socklen_t tolen = sizeof(to); + t_iemnet_chunk*c=queue_pop_block(q); if(c) { unsigned char*data=c->data; unsigned int size=c->size; + int result=-1; + // fprintf(stderr, "sending %d bytes at %x to %d\n", size, data, sockfd); - DEBUG("sending %d bytes", size); - result = send(sockfd, data, size, 0); + if(c->port) { + DEBUG("sending %d bytes to %x:%d", size, c->addr, c->port); + + to.sin_addr.s_addr=htonl(c->addr); + to.sin_port =htons(c->port); + + result = sendto(sockfd, data, size, 0, (struct sockaddr *)&to, tolen); + } else { + DEBUG("sending %d bytes", size); + result = send(sockfd, data, size, 0); + } if(result<0) { // broken pipe return 0; @@ -103,6 +117,7 @@ void iemnet__sender_destroy(t_iemnet_sender*s) { if(!s->keepsending)return; DEBUG("destroy sender %x", s); + s->keepsending=0; queue_finish(s->queue); DEBUG("queue finished"); @@ -119,6 +134,8 @@ void iemnet__sender_destroy(t_iemnet_sender*s) { s=NULL; DEBUG("destroyed sender"); } + + t_iemnet_sender*iemnet__sender_create(int sock) { t_iemnet_sender*result=(t_iemnet_sender*)getbytes(sizeof(t_iemnet_sender)); int res=0; -- cgit v1.2.1