Date: Thu, 26 Jan 2006 18:03:30 -0500 From: Kurt Miller <kurt@intricatesoftware.com> To: freebsd-hackers@freebsd.org Subject: read hang on datagram socket Message-ID: <200601261803.30503.kurt@intricatesoftware.com>
next in thread | raw e-mail | index | archive | help
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 <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/param.h>
#include <netinet/in.h>
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");
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601261803.30503.kurt>
