From owner-freebsd-hackers@FreeBSD.ORG Thu Jan 26 23:03:32 2006 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9A09E16A420 for ; Thu, 26 Jan 2006 23:03:32 +0000 (GMT) (envelope-from kurt@intricatesoftware.com) Received: from mta4.srv.hcvlny.cv.net (mta4.srv.hcvlny.cv.net [167.206.4.199]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1C34C43D4C for ; Thu, 26 Jan 2006 23:03:32 +0000 (GMT) (envelope-from kurt@intricatesoftware.com) Received: from [172.16.1.72] (ool-457a77e8.dyn.optonline.net [69.122.119.232]) by mta4.srv.hcvlny.cv.net (Sun Java System Messaging Server 6.2-4.03 (built Sep 22 2005)) with ESMTP id <0ITQ00M9P2PU55V0@mta4.srv.hcvlny.cv.net> for freebsd-hackers@freebsd.org; Thu, 26 Jan 2006 18:03:31 -0500 (EST) Date: Thu, 26 Jan 2006 18:03:30 -0500 From: Kurt Miller To: freebsd-hackers@freebsd.org Message-id: <200601261803.30503.kurt@intricatesoftware.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: inline User-Agent: KMail/1.9 X-Mailman-Approved-At: Thu, 26 Jan 2006 23:24:02 +0000 Subject: read hang on datagram socket X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Jan 2006 23:03:32 -0000 I'm working on 1.5 jdk certification on 5.4 and 6.0. One of the jck tests hangs on 5.4 but works ok on 6.0. I've reduced the problem down to the following C program that hangs on 5.4 but works fine (finishes) on 6.0 and 4.11. I could use some assistance with finding a work-around to the problem or an explanation as to why the program hangs on 5.4. Thank you, -Kurt #include #include #include #include #include #include #include void buildAddr4(struct sockaddr_in *addr4, int address, short port) { memset((char *) addr4, 0, sizeof(struct sockaddr_in)); addr4->sin_port = htons(port); addr4->sin_addr.s_addr = (uint32_t) htonl(address); addr4->sin_family = AF_INET; } void setAddress(struct sockaddr_in *addr4, int address) { addr4->sin_addr.s_addr = (uint32_t) htonl(address); } int getHostAddress() { char hostname[MAXHOSTNAMELEN]; struct addrinfo hints, *res; int address = 0; if (gethostname(hostname, MAXHOSTNAMELEN) != 0) exit(1); memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_CANONNAME; hints.ai_family = AF_INET; if(getaddrinfo(hostname, "domain", &hints, &res) != 0) exit(1); while( res != NULL ) { if (res->ai_family == AF_INET) { address = ntohl(((struct sockaddr_in*)(res->ai_addr))->sin_addr.s_addr); break; } res = res->ai_next; } return address; } int main() { int sock1, sock2; int optval = 1; struct sockaddr addr; struct sockaddr sock1Addr, sock2Addr; int sock1AddrLen, sock2AddrLen; short port1, port2; char sendBuf, readBuf; int hostAddress; if ((hostAddress = getHostAddress()) == 0) exit(1); buildAddr4((struct sockaddr_in *)&addr, 0, 0); if ((sock1 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) exit(1); if (setsockopt(sock1, SOL_SOCKET, SO_BROADCAST, (char*) &optval, sizeof(optval)) != 0) exit(1); if (bind(sock1, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0) exit(1); if (getsockname(sock1, &sock1Addr, &sock1AddrLen) != 0) exit(1); setAddress((struct sockaddr_in *)&sock1Addr, hostAddress); if ((sock2 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) exit(1); if (bind(sock2, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0) exit(1); if (getsockname(sock2, &sock2Addr, &sock2AddrLen) != 0) exit(1); setAddress((struct sockaddr_in *)&sock2Addr, hostAddress); if (connect(sock2, &sock1Addr, sock1AddrLen) != 0) exit(1); sendBuf = 22; if (sendto(sock1, &sendBuf, 1, 0, &sock2Addr, sock2AddrLen) != 1) exit(1); if (read(sock2, &readBuf, 1) != 1) exit(1); printf("no hang\n"); }