HELP! BSD select() on socket (WIN/TCP for VMS)
TAYBENGH%NUSDISCS.BITNET at cunyvm.cuny.edu
TAYBENGH%NUSDISCS.BITNET at cunyvm.cuny.edu
Thu Mar 22 01:00:34 AEST 1990
Subject: Re: HELP! BSD select() on socket (WIN/TCP for VMS)
In arctle <9003211059.AA22332 at portia.stanford.edu> Cuong Writes:
>>>gives without setting any fle descriptors (channels). For example,
>>
>>> if (nfd = (select(sock+1, &ready, &write, &except, &timeout)) <0)
>>> perror("select");
>>Just take a very sharp look at the code and especially the parentheses.
>> < has a higher priority than =
>>->
>> if ((nfd = select(sock+1, &ready, &write, &except, &timeout)) <0)
>> perror("select");
>
>Yes, but it doesn't help explain non-blocking behavior for
>Beng Hang. What does this perror() report? Bad access?
>If so, have you considered Holger's comment re. "&read" instead
>of "read"? What is the actual code?
>
>Good luck,
>
>Cuong
I admit the mistake made of assigning nfd. Thanks for the correction!
Below is the full source code (written in VAX-C).
In the message <9003202303.AA24028 at uunet.uu.net> sent by Larry Jones:
>Since this is VMS, you might have more luck posting to a VMS news
>group like comp.os.vms rather than a unix group!
I know I should post it somewhere else, but since there are a lot
of experts in this list, I push my luck. I apologize if I posted wrongly.
-Beng Hang Tay (email address: taybengh at nusdiscs.bitnet)
Department of Information Systems and Computer Science
National University of Singapore
----------------------cut here---------------------------------------------
/* Filename : select_recv.c
Author : Beng Hang Tay (taybengh)
Description : Test program that receive buffers via stream service
using socket accept and recv. Note that raccept routine does
not distinguish the source, thus remote_sock is just a
memory space that store the incoming struct sockaddr_in value.
*/
#include <sys/types>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
main()
{
int sock, socklen, size, newsock, flag, nfd;
struct sockaddr_in local_in, remote_in;
char inbuf[1024], outbuf[1024], hostname[15], str[10];
u_short local_port, remote_port;
fd_set ready, write, except;
struct timeval to;
printf("pls input the local port (>1000)\n");
gets(str);
local_port = atoi(str);
printf("pls input the source hostname if any\n");
gets(hostname);
printf("pls input the source port if any, otherwise 0\n");
gets(str);
remote_port = atoi(str);
printf("pls input the option if any, otherwise default=0\n");
gets(str);
flag = atoi(str);
/* Create socket from which to read */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock <0)
{
perror("opening stream socket");
exit(1);
}
/* create sockaddr */
local_in.sin_family = AF_INET;
local_in.sin_addr.s_addr = INADDR_ANY;
local_in.sin_port = htons(local_port);
if (bind(sock, &local_in, sizeof(local_in)))
{
perror("binding stream socket");
exit(1);
}
/* create sockaddr */
printf("hostname =%s!\n", hostname);
remote_in.sin_family = AF_INET;
/* There is always a acess violation error due to the following
statement, so it was masked off. The reason unknown!
remote_in.sin_addr.s_addr = rhost(&hostname);
*/
remote_in.sin_port = htons(remote_port);
#ifdef BDEBUG
printf("\n\nbefore accept\n");
printf("sock: \n");
printf("family = %d \n", remote_in.sin_family);
printf("sin_addr.s_addr = %x \n", ntohl(remote_in.sin_addr.s_addr));
printf("net number = %x \n", inet_netof(remote_in.sin_addr));
printf("local address part = %x \n", inet_lnaof(remote_in.sin_addr));
printf("port # = %u\n", ntohs(remote_in.sin_port));
#endif
listen(sock, 5);
for (;;)
{
/*
* set the poll time to very large value
*/
to.tv_sec = 100000;
to.tv_usec = 100000;
FD_ZERO(&ready);
FD_ZERO(&write);
FD_ZERO(&except);
FD_SET(sock, &ready);
FD_SET(sock, &write);
FD_SET(sock, &except);
/* Null pointer is not working, giving acess violation problems! */
if ((nfd = select(sock+1, &ready, &write, &except, 0)) <0)
{
perror("select");
break;
}
/*
* select() always return with nfd set to 1
*/
#ifdef BDEBUG
printf("select polling return nfd = %d\n", nfd);
printf("timeval.tv_sec = %d, tv_usec = %d\n",
to.tv_sec, to.tv_usec);
printf("ready = %d, write =%d, except = %d\n",
ready, write, except);
#endif
/*
* NEVER COME INSIDE THE IF
*/
if (FD_ISSET(sock, &ready))
{
socklen = sizeof(remote_in);
newsock = accept(sock, &remote_in, &socklen);
#ifdef BDEBUG
printf("\nafter accept\n");
printf("newsock = %d: \n", newsock);
printf("family = %d \n", remote_in.sin_family);
printf("sin_addr.s_addr = %x \n", ntohl(remote_in.sin_addr.s_addr));
printf("net number = %x \n", inet_netof(remote_in.sin_addr));
printf("local address part = %x \n", inet_lnaof(remote_in.sin_addr));
printf("port # = %u\n", ntohs(remote_in.sin_port));
#endif
if (newsock == -1)
perror("accept");
else
for (;;)
{
/* receive message */
if ((size = recv(newsock, inbuf, 1024, flag)) < 0)
perror("receiving stream message");
if (size == 0)
printf("ending connection\n");
else
printf("received-->%s\n", inbuf);
if (inbuf[0] == '\n' || inbuf[0] == '\0')
exit(0);
/* send message */
printf("\nPls input the messages:\n");
gets(outbuf);
if ((size = send(newsock, outbuf,
sizeof(outbuf), flag)) < 0)
perror("send");
printf("buf sent-->%s, size =%d\n", outbuf, size);
if (outbuf[0] == '\n' || outbuf[0] == '\0')
exit(0);
}
}
close(newsock);
}
}
-----------------cut here-----------------------------------------------------
More information about the Comp.unix.wizards
mailing list