toadi has asked for the wisdom of the Perl Monks concerning the following question:
I have a server listening on a socket. Ready to spawn a single proces to run. Now I want a client to connect to the server, but immediatly disconnect. The server only starts one process and will only run another one when the first one is finished, regardless how many connects there are from the clients. So I don't want my clients to be waiting!!!
A layout for a simple client(but it keeps waiting):
what did I do to stop waiting I commented:#!/usr/bin/perl -w use IO::Socket; my ($host,$port) = ("localhost","9000"); $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => $port) or die "cannot connect remote"; print STDERR "[Connected to $host:$port]\n"; while ( <$remote> ) { print }
#while ( <$remote> ) { print }
But when 2 clients at the same time connect the server dies wit following error:
Use of uninitialized value at /usr/local/lib/perl5/5.00503/sun4-solaris/Socket.pm line 295. Bad arg length for Socket::unpack_sockaddr_in, length is 0, should be 16 at /usr/local/lib/perl5/5.00503/sun4-solaris/Socket.pm line 295.
I'm in desperared need of help, because my c program also gives the same error if I don't wait for a answer from the server...
Probably I looked over someting abviously about client/server programming. But can someone with more experience on the subject enlighten me :)#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 9000 /* the port client will be connecting to */ #define MAXDATASIZE 100 /* max number of bytes we can get at once */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he = NULL; struct sockaddr_in their_addr; /* connector's address information +*/ if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info * +/ perror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(PORT); /* short, network byte order * +/ their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '\0', 8); /* zero the rest of the +struct */ if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct +sockaddr)) == -1) { perror("connect"); close(sockfd); exit(1); } close(sockfd); return 0; }
Edit title by tye
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Sockets
by jepri (Parson) on Jan 08, 2002 at 15:49 UTC | |
|
Re: Sockets
by rob_au (Abbot) on Jan 08, 2002 at 17:01 UTC | |
|
Re: Sockets
by agoth (Chaplain) on Jan 08, 2002 at 15:42 UTC | |
|
Re: Sockets
by jebe68 (Initiate) on Jan 08, 2002 at 20:22 UTC |