Layout:

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):

#!/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 }
what did I do to stop waiting I commented:

#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...

#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; }
Probably I looked over someting abviously about client/server programming. But can someone with more experience on the subject enlighten me :)

--
My opinions may have changed,
but not the fact that I am right

Edit title by tye


In reply to Sockets: Client keeps waiting by toadi

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.