From owner-freebsd-hackers@FreeBSD.ORG Thu Jan 26 23:26:30 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 02C6616A46B for ; Thu, 26 Jan 2006 23:26:30 +0000 (GMT) (envelope-from lists@intricatesoftware.com) Received: from mta2.srv.hcvlny.cv.net (mta2.srv.hcvlny.cv.net [167.206.4.197]) by mx1.FreeBSD.org (Postfix) with ESMTP id A532743D6D for ; Thu, 26 Jan 2006 23:26:23 +0000 (GMT) (envelope-from lists@intricatesoftware.com) Received: from [172.16.1.72] (ool-457a77e8.dyn.optonline.net [69.122.119.232]) by mta2.srv.hcvlny.cv.net (Sun Java System Messaging Server 6.2-4.03 (built Sep 22 2005)) with ESMTP id <0ITQ00EOY3QNOPJ0@mta2.srv.hcvlny.cv.net> for freebsd-hackers@freebsd.org; Thu, 26 Jan 2006 18:25:35 -0500 (EST) Resent-date: Thu, 26 Jan 2006 18:25:11 -0500 Date: Thu, 26 Jan 2006 18:25:34 -0500 Resent-from: Kurt Miller From: Kurt Miller Resent-to: freebsd-hackers@freebsd.org To: freebsd-hackers@freebsd.org Resent-message-id: <200601261825.11402.kurt@intricatesoftware.com> 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 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:26:30 -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"); }