Return to BSD News archive
Newsgroups: comp.unix.programmer,comp.unix.bsd.freebsd.misc
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!news.mel.connect.com.au!munnari.OZ.AU!news.ecn.uoknor.edu!feed1.news.erols.com!news.bbnplanet.com!cpk-news-hub1.bbnplanet.com!newsserver.jvnc.net!newsreader.jvnc.net!netplex-tech.com!not-for-mail
From: vikas@netplex-tech.Com (Vikas Aggarwal)
Subject: Re: UDP Sockets sendto() failures
Message-ID: <E3H7yK.18t@netplex-tech.com>
Followup-To: comp.unix.programmer,comp.unix.bsd.freebsd.misc
Lines: 179
Sender: news@netplex-tech.com
Organization: Netplex Technologies Inc.
X-Newsreader: TIN [UNIX 1.3 950824BETA PL0]
References: <E3DxuK.6I8@netplex-tech.com>
Date: Sat, 4 Jan 1997 09:06:19 GMT
Xref: euryale.cc.adfa.oz.au comp.unix.programmer:48287 comp.unix.bsd.freebsd.misc:33521
Since a number of people have suggested that it is more likely that I
have a bug in my code, I am posting my code below.
Due apologies for wasting other people's time if it indeed turns out to
be a bug in my code.
-vikas
I had written in an earlier posting:
: I dont know if this is a known fact, but on Linux 1.2 and FreeBSD 2.1
: platforms, the sendto() call does not work (for UDP). Replacing the
: sendto() with a connect() + send() sequence works though.
:
/*
* Test snippet to see if sendto() works. Use :
* tcpdump udp port xxxx
* to look for the packets.
*
* I cannot seem to get sendto() working on FreeBSD 2.1.x (works on
* SunOS 4.1.x)
*
* Note that sendto() reports proper number of bytes sent, but tcpdump
* does NOT show any data.
*
* -vikas@navya.com (Vikas Aggarwal)
*/
#include <sys/types.h>
#include <sys/socket.h> /* for AF_INET */
#include <sys/ioctl.h>
#include <sys/file.h>
#include <netinet/in.h> /* for struct in_addr */
#include <sys/un.h> /* for struct sockaddr_un (Unix style sockets) */
#include <arpa/inet.h> /* for inet_ntoa() */
#include <errno.h>
#include <netdb.h> /* for getservbyname() struct hostent definition */
#include <syslog.h> /* for report(), openlog, etc. */
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h> /* for timeval struct */
#ifdef AIX
# include <sys/select.h>
#endif
#include <stdio.h>
char *Strerror(n)
int n;
{
#if !defined(__FreeBSD__) && !defined(__BSDI__)
extern char *sys_errlist[];
#endif
return (char *)sys_errlist[n];
}
/*
* - Create a socket of type DGRAM or STREAM
* - Bind to proper Port and local address
* - Return the socket to the calling routine
*/
newsocket_ip(type, port, service)
int type; /* SOCK_DGRAM or SOCK_STREAM */
int port; /* which port number, used IF service not specified */
char *service; /* service name. If not specified, use port */
{ /* begin newsocket() */
int sockfd;
struct sockaddr_in my_addr; /* IP domain */
/* Pick up a socket */
if ((sockfd = socket(AF_INET, type, 0)) < 0)
{
fprintf(stderr, "Error socket: IP port %d %s", port, Strerror(errno));
return(-1);
}
/* Get port we need to pay attention to */
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (service && *service)
{
register struct servent *sp;
if (type == SOCK_DGRAM)
sp = getservbyname(service, "udp");
else if (type == SOCK_STREAM)
sp = getservbyname(service, "tcp");
else
fprintf(stderr, "daemon: Unknown type %d (not DGRAM or STREAM)", type);
if (sp != NULL)
my_addr.sin_port = sp->s_port;
}
if (my_addr.sin_port == 0)
my_addr.sin_port = htons(port);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0)
{
fprintf(stderr, "bind: %d %s, exiting", port, Strerror(errno));
return(-1);
}
return (sockfd); /* return the socket */
} /* end newsocket_ip() */
/*
* Send a UDP message on an open file descriptor to the destination specified.
*/
send_udpmesg(buf, bufsize, dgramfd, host, port)
char *buf;
char *host; /* destination IP address */
int port, bufsize, dgramfd;
{
int nsent;
static int connected;
char *desthost;
struct sockaddr_in dest_addr_in;
if (host == NULL) desthost = "127.0.0.1"; /* localhost */
else desthost = host;
bzero(&dest_addr_in, sizeof(dest_addr_in));
dest_addr_in.sin_family = AF_INET;
dest_addr_in.sin_addr.s_addr = inet_addr(desthost);
dest_addr_in.sin_port = port;
/* Now send off the packet to the destination */
fprintf(stderr, "Using sendto()... to %s port %d\n", host, port);
nsent = sendto(dgramfd, buf, bufsize, 0, (struct sockaddr *)&dest_addr_in,
sizeof(struct sockaddr_in));
if (nsent != bufsize)
{
fprintf(stderr, "sendto(%s)- %s", desthost, Strerror(errno));
return(-1);
}
else
{
/* report(LOG_INFO, "send_udpmesg()Sent datagram to %s port %d",
* desthost, port);
*/
}
return(nsent);
} /* send_udpmesg() */
main()
{
int fd = newsocket_ip(SOCK_DGRAM, 0, NULL);
int nread, fromport, destport;
char buf[1024], desthost[32], strport[8], *fromhost;
printf("Enter dest host IP: "); fgets(desthost, 32, stdin);
printf("Enter dest port >1023: "); fgets(strport, 8 , stdin);
printf("Enter data line: "); fgets(buf, 1024, stdin);
desthost[strlen(desthost) - 1] = '\0'; /* get rid of '\n' */
destport = atoi(strport);
if (send_udpmesg(buf, strlen(buf), fd, desthost, destport) != strlen(buf))
exit (-1);
else
fprintf(stderr, "(main) Sent UDP message to port %d\n", destport);
exit (0);
}