Socket

Socket

为什么程序只运行到bind时就失败了呢,运行显示是:socket ok
                                                                         bind UNknown error
哪位能给指点一下嘞!!!

#!/usr/bin/perl

    # The server and the client are on the same machine.

   $AF_INET=1;     # The domain is AF_INET
   $SOCK_STREAM=1; # The type is SOCK_STREAM
   $PROTOCOL=0;    # Protocol 0 is accepted as the "correct
                    # protocol" by most systems.


   socket(SERVERSOCKET, $AF_UNIX, $SOCK_STREAM, $PROTOCOL) ||
        die " Socket $!\n";
    print "socket OK\n";
   $name="./greetings";  # The name of the socket is associated
                          # within the file system
    unlink "./greetings" || warn "$name: $!\n";

   bind(SERVERSOCKET, $name) || die "bind $!\n";
    print "bind OK\n";

   listen(SERVERSOCKET, 5) || die "Listen $!\n";
    print "listen OK\n";

    while(1){

   accept(NEWSOCKET, SERVERSOCKET ) || die "Accept $!\n";
    # Accept client connection

   $pid=fork || die "Fork: $!\n";
  if ($pid == 0 ){
      print $NEWSOCKET "Greetings from your server!!\n";

      close(NEWSOCKET);
        exit(0);
    }
    else{
      close (NEWSOCKET);
    }
  }
如下客户端程序:
#!/usr/bin/perl

use Socket;
     use FileHandle;
    use strict;
    my($remote, $port, @thataddr, $that,$them, $proto,@now,
         $hertime);


     print "Hi, I'm in perl program \'client\' \n";
    $remote = shift || 'localhost' ;
    $port = 29688 ;  # timeserver is at this port number
    @thataddr=gethostbyname($remote);

    $that = pack('Sna4x8', AF_INET, $port, $thataddr[4]);

    $proto = getprotobyname('tcp');

     # Make the socket filehandle

    if ( socket(SOCK, PF_INET, SOCK_STREAM, $proto ) ){
         print "Socket ok.\n";
     }
     else { die $!; }

     # Call up the server
   if (connect(SOCK, $that)) {
         print  "connect ok!\n";
     }
     else { die $!;}

     # Set socket to be command buffered

   SOCK->autoflush;


     # Now we're connected to the server, let's read her host time
   $hertime = <SOCK>;
   close(SOCK);

   print "Server replies: $hertime\n";
   @now = localtime($hertime);

我想用它发送一条消息(what's the time now?)给服务器端,
接上帖:
我想用它发送一条消息(what's the time now?)给服务器端,该怎么做?
要用什么命令,
是send吗?具体该怎么运用,哪位给指点一下,谢谢!
1.写代码最好加上

[Copy to clipboard] [ - ]
CODE:
use strict;
use warnings;

2.你都已经知道bind这一块有点问题了

[Copy to clipboard] [ - ]
CODE:
perldoc -f bind



QUOTE:
bind SOCKET,NAME
               Binds a network address to a socket, just as the bind system
               call does.  Returns true if it succeeded, false otherwise.
               NAME should be a packed address of the appropriate type for the
               socket.  See the examples in "Sockets: Client/Server Communica‐
               tion" in perlipc.

NAME部分是一个packed address
你那个行吗?
现在这个程序bind一块是没有问题的,可以绑定成功,并且跟server连接通讯
如果你有C的基础,用这个原始的socket可以。
但是如果没有,为什么不老老实实的用IO::Socket::INET呢?
自讨苦吃。


QUOTE:
原帖由 撒哈拉里的鱼 于 2008-12-31 11:17 发表
如果你有C的基础,用这个原始的socket可以。
但是如果没有,为什么不老老实实的用IO::Socket::INET呢?
自讨苦吃。

同意。

应该直接整 POE。
上面的程序已经搞定,感谢各位指点啊!
用原始的socket主要是为了更好的了解socket的通讯过程!

我对POE不熟悉,前辈们如果有POE方面的好的资料,可否分享一下,万分感谢!