delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2006/09/27/11:17:53

X-Spam-Check-By: sourceware.org
From: Anonymous <cripto AT ecn DOT org>
Comments: This message did not originate from the Sender address above. It was remailed automatically by anonymizing remailer software. Please report problems or inappropriate use to the remailer administrator at <cripto_abuse AT ecn DOT org>.
To: cygwin AT cygwin DOT com
Subject: Problems with bind and UDP server
Message-ID: <ad8a712d65c60c373f7bf4d79f917713@ecn.org>
Date: Wed, 27 Sep 2006 17:14:35 +0200 (CEST)
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

Hello,

I saw these series of posts on UDP - was there a conclusion to them?

http://cygwin.com/ml/cygwin/2006-06/msg00701.html
http://cygwin.com/ml/cygwin/2006-06/msg00703.html
http://cygwin.com/ml/cygwin/2006-06/msg00705.html
http://cygwin.com/ml/cygwin/2006-06/msg00706.html

I compile and run net-snmp under cygwin (I have net-snmp 5.3.0.1).
The server snmpd by default uses UDP port 161. I now have the most
recent cygwin DLL and the server snmpd seems no longer to work.

I think I tracked down the problem to the bind command. For a 
"very simple test" I used Beej's socket programming examples.
I give the listings at the end of the message.

http://beej.us/guide/bgnet/output/htmlsingle/bgnet.html#listen

The listener program works fine on regular Linux and with older
cygwin DLLs ..... but under the latest it returns an error.
Has something changed?

Many Thanks,

    Mark.

-----
reply-to:mark DOT naylor AT I_HATE_SPAM DOT nowhere
replace the I_HATE_SPAM.nowhere with
schmid-telecom.com to get my real email address
-----

listener.c
====
/*
** listener.c -- a datagram sockets "server" demo
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MYPORT 4950     // the port users will be connecting to

#define MAXBUFLEN 100

int main(void)
{
        int sockfd;
        struct sockaddr_in my_addr;     // my address information
        struct sockaddr_in their_addr; // connector's address information
        socklen_t addr_len;
        int numbytes;
        char buf[MAXBUFLEN];

        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
                perror("socket");
                exit(1);
        }

        my_addr.sin_family = AF_INET;            // host byte order
        my_addr.sin_port = htons(MYPORT);        // short, network byte order
        my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
        memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct

        if (bind(sockfd, (struct sockaddr *)&my_addr,
                sizeof(struct sockaddr)) == -1) {
                perror("bind");
                exit(1);
        }

        addr_len = sizeof(struct sockaddr);
        if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
                (struct sockaddr *)&their_addr, &addr_len)) == -1) {
                perror("recvfrom");
                exit(1);
        }

        printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
        printf("packet is %d bytes long\n",numbytes);
        buf[numbytes] = '\0';
        printf("packet contains \"%s\"\n",buf);

        close(sockfd);

        return 0;
}
====

talker.c

====
/*
** talker.c -- a datagram "client" demo
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define SERVERPORT 4950 // the port users will be connecting to

int main(int argc, char *argv[])
{
        int sockfd;
        struct sockaddr_in their_addr; // connector's address information
        struct hostent *he;
        int numbytes;

        if (argc != 3) {
                fprintf(stderr,"usage: talker hostname message\n");
                exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
                perror("gethostbyname");
                exit(1);
        }

        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
                perror("socket");
                exit(1);
        }

        their_addr.sin_family = AF_INET;         // host byte order
        their_addr.sin_port = htons(SERVERPORT); // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

        if ((numbytes = sendto(sockfd, argv[2], strlen(argv[2]), 0,
                         (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
                perror("sendto");
                exit(1);
        }

        printf("sent %d bytes to %s\n", numbytes, inet_ntoa(their_addr.sin_addr));

        close(sockfd);

        return 0;
}



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019