Skip to Content.
Sympa Menu

freetds - Re: [freetds] connect(2) for UDP

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: "James K. Lowden" <jklowden AT freetds.org>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] connect(2) for UDP
  • Date: Thu, 18 Dec 2008 18:40:43 -0500

Peter Deacon wrote:
>
> UDP has no concept of connection. Each message stands alone.
>
> If the server binds to all interfaces and there are multiple interfaces
> capable of reaching the client the source address of messages from the
> server should be concidered random/determined by the routing system.

Not only are you right, you're right. I even read as much after posting
my message.

And I found a server that answers on a different interface! :-) And,
using a combination of techniques, I seem to have something that works.

1. If I connect only, I miss answers from other interfaces.
2. If I bind only, I don't get ECONNREFUSED, only a timeout. Perhaps
that's me or my implementation.

Therefore, I do both, using two sockets, of course. select(2) tells me
which one is ready, and, mirabile dictu, I get what I want: success,
timeout, or ECONNREFUSED.


== code ==
fd_set fds;
FD_ZERO(&fds);
FD_SET(s1, &fds);
FD_SET(s2, &fds);

struct timeval timeout;
bzero(&timeout, sizeof(timeout));
timeout.tv_sec = 5;
timeout.tv_usec = 0;

cout << "reading from " << hostname << ":" << port << " ... " <<
flush;

if( (erc = select(s2 + 1, &fds, NULL, NULL, &timeout)) == -1 ) {
perror("select(2) failed");
return 1;
}

if( 0 == erc ) {
cerr << "timed out, sorry.\n";
return 1;
}

cout << erc << " fd ready on " << flush;

int s;
char buffer[2048];

if( FD_ISSET(s1, &fds) ) {
s = s1;
cout << "connected ... " << flush;
}
if( FD_ISSET(s2, &fds) ) {
s = s2;
cout << "bound ... " << flush;
}

while( (erc = read(s, &buffer, sizeof(buffer))) == -1 ) {
perror("could not read");
return 1;
}

cout << "done. (read " << erc << " bytes)\n" << flush;

== edoc ==

Data arrive on the bound port. Errors are detected on the connected port:


== output ==
$ ./connect_udp -h db03 -p 1434
address of db03 is 10.10.10.10
binding local UDP socket ... done
sending to db03:1434 ... done. (sent 1)
connecting UDP socket to db03:1434 ... done
writing to db03:1434 ... done. (wrote 1)
reading from db03:1434 ... 1 fd ready on bound ... done. (read 411 bytes)

./connect_udp -h localhost -p 1434
address of localhost is 127.0.0.1
binding local UDP socket ... done
sending to localhost:1434 ... done. (sent 1)
connecting UDP socket to localhost:1434 ... done
writing to localhost:1434 ... done. (wrote 1)
reading from localhost:1434 ... 1 fd ready on connected ...
could not read: Connection refused
== tuptou ==

Too bad none of this is standardized. Standards? We don't need no
stinking standards!

That about wraps up the research. I think I'll file a bug report and see
if the project maintaner will update FreeTDS. Oh, wait....

Regards,

--jkl

Attachment: connect_udp.C
Description: Binary data




Archive powered by MHonArc 2.6.24.

Top of Page