You're using htons on an int. Try not doing that.
Barney Wolff
On Fri, Sep 14, 2001 at 12:23:57PM -0700, Jos Backus wrote:
> I am seeing the following difference between FreeBSD and Solaris when using
> the attached program, which uses getsockname().
> I am using the following command to test this program:
>
> snmpwalk -p 1234 <host> public
>
> <host> being either goldenbytes or taiko.
>
> On FreeBSD 4 I see:
>
> goldenbytes:~/udp% ./udp &
> [1] 64015
> goldenbytes:~/udp% received on 0.0.0.0:0
> received 37 bytes from 157.57.212.23:1446
> received on 0.0.0.0:0
> received 37 bytes from 157.57.212.23:1446
> received on 0.0.0.0:0
> received 37 bytes from 157.57.212.23:1446
> received on 0.0.0.0:0
> received 37 bytes from 157.57.212.23:1446
>
> On Solaris 7 I see:
>
> taiko:~/udp% ./udp &
> [1] 21129
> taiko:~/udp% received on 0.0.0.0:1234
> received 37 bytes from 157.57.212.23:1448
> received on 0.0.0.0:1234
> received 37 bytes from 157.57.212.23:1448
> received on 0.0.0.0:1234
> received 37 bytes from 157.57.212.23:1448
> received on 0.0.0.0:1234
> received 37 bytes from 157.57.212.23:1448
>
> The 0.0.0.0 is caused by using INADDR_ANY as the binding address; what I don't
> understand is why Solaris shows the portnumber whereas FreeBSD doesn't. Surely
> I am doing something wrong, but what?
>
> Thanks,
> --
> Jos Backus _/ _/_/_/ Santa Clara, CA
> _/ _/ _/
> _/ _/_/_/
> _/ _/ _/ _/
> [EMAIL PROTECTED] _/_/ _/_/_/ use Std::Disclaimer;
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <string.h>
> #include <errno.h>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <arpa/inet.h>
>
> #define PDU_SIZE 1500
>
> struct sock {
> int fport;
> int fsockfd;
> long sockbuflen;
> };
>
> static int
> init_sock(ctx)
> struct sock *ctx;
> {
> struct sockaddr_in local_address;
>
> bzero(&local_address, sizeof local_address);
> local_address.sin_family = AF_INET;
> local_address.sin_addr.s_addr = htonl(INADDR_ANY);
> local_address.sin_port = htons(ctx->fport);
>
> if ((ctx->fsockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
> fprintf(stderr, "socket(): %s\n", strerror(errno));
> exit(1);
> }
> if (bind(ctx->fsockfd,
> (struct sockaddr *)&local_address, sizeof local_address) < 0) {
> fprintf(stderr, "bind(): %s\n", strerror(errno));
> exit(1);
> }
> }
>
> static int
> receive(ctx)
> struct sock *ctx;
> {
> unsigned char fpdu[PDU_SIZE];
> struct sockaddr_in remote_address;
> struct sockaddr_in local_address;
> int i, len, n, local_len;
>
> while (1) {
> len = sizeof remote_address;
> if ((n = recvfrom(ctx->fsockfd, (char *)fpdu,
> sizeof(fpdu), 0,
> (struct sockaddr *)&remote_address, &len)) == -1) {
> fprintf(stderr, "recvfrom(): %s\n", strerror(errno));
> exit(1);
> }
> if (getsockname(ctx->fsockfd, (struct sockaddr *)&local_address,
> &local_len) == -1) {
> fprintf(stderr, "getsockname(): %s\n", strerror(errno));
> exit(1);
> }
> if (n > PDU_SIZE) {
> fprintf(stderr, "Warning: %d excess bytes discarded\n",
> n - PDU_SIZE);
> n = PDU_SIZE;
> }
> if (len != sizeof remote_address) {
> fprintf(stderr, "recvfrom() return address length %d -
>expected %d\n",
> len, sizeof remote_address);
> exit(1);
> }
> fprintf(stderr, "received on %s:%d\n",
> inet_ntoa(local_address.sin_addr),
> (int)ntohs(local_address.sin_port));
> fprintf(stderr, "received %d bytes from %s:%d\n",
> n,
> inet_ntoa(remote_address.sin_addr),
> (int)ntohs(remote_address.sin_port));
> }
> }
>
> int
> main(int ac, char *av[])
> {
> struct sock s;
>
> s.fport = 1234;
> s.sockbuflen = 65536;
>
> init_sock(&s);
>
> receive(&s);
> }
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message