HP OpenVMS Systemsask the wizard |
The Question is: I have an application running in OpenVMS as client using socket connection to a server NT application. My problem is connect() function in Open VMS takes too long to timeout (about 2 min.) What can I do to change this timeout to 5 seconds or so. I attempt ed to use an AST to close socket with a sys$setimr() but somehow it screws up the socket after that. Please advise me on this issue. Thank you very much The Answer is :
Something like the following (untested) program should be close -- the
key here is use of the TCPIP$C_TCP_PROBE_IDLE in the setsockopt call.
#include <socket.h>
#include <stdlib.h>
#include <in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unixio.h>
#include <tcpip$inetdef.h>
main(int argc, char *argv[]) {
int s, i, len, five=5;
struct sockaddr_in lcladdr, rmtaddr;
char message[512];
struct hostent *hp;
if (argc != 2) {
printf("Usage: %s <hostname>\n", argv[0]);
exit(0);
}
if (!(hp = gethostbyname(argv[1]))) {
printf("Unknown host: %s\n", argv[1]);
exit(0);
}
lcladdr.sin_family = AF_INET;
lcladdr.sin_addr.s_addr = INADDR_ANY;
lcladdr.sin_port = htons(0);
rmtaddr.sin_family = AF_INET;
rmtaddr.sin_addr.s_addr = *(int *)hp->h_addr_list[0];
rmtaddr.sin_port = htons(1234);
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) perror("socket");
if (bind(s, (void *) &lcladdr, sizeof(lcladdr))) perror("bind");
if (setsockopt(s, TCPIP$C_TCP, TCPIP$C_TCP_PROBE_IDLE, &five, sizeof(five)))
perror("setsockopt");
if (connect(s, (void *) &rmtaddr, sizeof(rmtaddr))) perror("connect");
do {
len = read(s, message, sizeof(message));
if (len>0) write(1, message, len);
} while (len>0);
if (len<0) perror("read");
if (close(s)) perror("close");
return EXIT_SUCCESS;
|