From owner-freebsd-questions@FreeBSD.ORG Wed Oct 6 02:42:32 2010 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 859B9106566C for ; Wed, 6 Oct 2010 02:42:32 +0000 (UTC) (envelope-from s.dave.jones@gmail.com) Received: from mail-qy0-f175.google.com (mail-qy0-f175.google.com [209.85.216.175]) by mx1.freebsd.org (Postfix) with ESMTP id 3D0558FC08 for ; Wed, 6 Oct 2010 02:42:32 +0000 (UTC) Received: by qyk4 with SMTP id 4so157560qyk.13 for ; Tue, 05 Oct 2010 19:42:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=rAvsAeG1ENysJ0zrAqwT0mROXE/baC2wF7nYdk7Em1E=; b=Uoi05NubD5+BXlH6pR18JMIGqO7lu6K08wzVkpUwqF6zJr0FCMJIK+frGkSlbhZSKj 9r2CWK60qYPukNuzh5lC/vHcY9e5r90yBxqgiFznqV/Deth/OmeHWrHZZYs6a03qNXXS qzUCOU2wU4vpEkE9guvzWOnv4unA1jdo95wSw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=LvB3su7ntq83zhG+u4Kn4xbjoE+MTNN6lglvX6igg/BXWNHDNlYVJ3F8yUoTRkkN0o atC3hvXTmIvurGUwvhAEvxa+OzWrR6WNC0q4xZ/AIzhqeNZB3RuoXt3qo42sbhUmaP7w yjT4LdEx5Ax5zrvrxkDf0blbgxsKbYK5A+C6o= MIME-Version: 1.0 Received: by 10.220.185.205 with SMTP id cp13mr503808vcb.197.1286332951420; Tue, 05 Oct 2010 19:42:31 -0700 (PDT) Received: by 10.220.202.136 with HTTP; Tue, 5 Oct 2010 19:42:31 -0700 (PDT) Date: Wed, 6 Oct 2010 10:42:31 +0800 Message-ID: From: dave jones To: freebsd-questions@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Subject: Questions about udp socket(AF_UNSPEC) X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Oct 2010 02:42:32 -0000 Hi, When disconnect a UDP socket, Linux kernel set local port to zero if the port number comes from a implicit bind, but on FreeBSD, it doesn't set local port to zero. Here's my test program: #include #include #include #include #include #include #include #include #include #include #define SERV_PORT 12345 void print_local_addr(int s); int main(int argc, char** argv) { int sockfd; struct sockaddr_in servaddr, cliaddr; if (argc != 2) { printf("Usage: disconnect_udp "); exit(0); } // creat a UDP socket which binds to a local address sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&cliaddr, sizeof(cliaddr)); cliaddr.sin_family = AF_INET; if (inet_pton(AF_INET, argv[1], &cliaddr.sin_addr) != 1) { perror("inet_pton failed"); } bind(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); // connect this UDP socket bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) != 1) { perror("inet_pton failed"); } if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { perror("connect failed"); } print_local_addr(sockfd); // disconnect it servaddr.sin_family = AF_UNSPEC; if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { perror("connect failed"); } print_local_addr(sockfd); close(sockfd); } void print_local_addr(int s) { struct sockaddr_in localaddr; socklen_t len = 0; char temp[INET_ADDRSTRLEN]; len = sizeof(localaddr); if (getsockname(s, (struct sockaddr *)&localaddr, &len) != 0) { perror("getsockname failed"); } inet_ntop(AF_INET, &localaddr.sin_addr, temp, INET_ADDRSTRLEN); printf("Local binding: address=%s, port=%d\n", temp, ntohs(localaddr.sin_port)); } In Linux: Local binding: address=192.168.1.30, port=42610 Local binding: address=192.168.1.30, port=0 In FreeBSD: Local binding: address=192.168.1.30, port=35133 connect failed: Address family not supported by protocol family Local binding: address=0.0.0.0, port=0 Any idea? Thank you. Regards, Dave.