- 论坛徽章:
- 0
|
Windows下socket编程与Linux下主要有哪些区别呀?
以下是我从《Network Programming with Perl》Chapter 16. IO:: Poll中复制的一段代码,在Linux运行一切正常,但是在Windows下运行则完全没有反映,$poll->handles(POLLIN|POLLHUP|POLLERR)和$poll->handles(POLLOUT|POLLERR)始终没有结果。
我用IO::Select也不行,fork子进程也一样,所以想问问在Windows下socket编程到底有些什么特殊地方?
我是想实现一个跨平台的交互式的Telnet客户端!
- #!/usr/bin/perl -w
- # file gab7.pl
- # usage: gab7 [host] [port]
- use strict;
- use warnings;
- use IO::Socket;
- use IO::Poll;
- use Errno qw(EWOULDBLOCK);
- use constant MAXBUF => 8192;
- $SIG{PIPE} = 'IGNORE';
- my ($to_stdout, $to_socket, $stdin_done, $socket_done) = ('', '', 0, 0);
- my $host = '202.102.197.65';
- my $port = '5555';
- my $socket = IO::Socket::INET->new("$host:$port") or die $@;
- my $poll = IO::Poll->new() or die "Can not create IO::Poll Object";
- $poll->mask(\*STDIN => POLLIN);
- $poll->mask($socket => POLLIN);
- $socket->blocking(0);
- STDOUT->blocking(0);
- while ($poll->handles) {
- $poll->poll();
- for my $handle ($poll->handles(POLLIN|POLLHUP|POLLERR)) {
- if ($handle eq \*STDIN) {
- $stdin_done++ unless sysread(STDIN, $to_socket, MAXBUF, length $to_socket);
- }
- elsif ($handle eq $socket) {
- $socket_done++ unless sysread($socket, $to_stdout, MAXBUF, length $to_stdout);
- }
- }
- for my $handle ($poll->handles(POLLOUT|POLLERR)) {
- if ($handle eq \*STDOUT) {
- my $bytes = syswrite(STDOUT, $to_stdout);
- unless ($bytes) {
- next if $! == EWOULDBLOCK;
- die "write to stdout failed: $!";
- }
- substr($to_stdout, 0, $bytes) = '';
- }
- elsif ($handle eq $socket) {
- my $bytes = syswrite($socket, $to_socket);
- unless ($bytes) {
- next if $! == EWOULDBLOCK;
- die "write to socket failed: $!";
- }
- substr($to_socket, 0, $bytes) = '';
- }
- }
- } continue {
- my ($outmask, $inmask, $socketmask) = (0, 0, 0);
- $outmask = POLLOUT if length $to_stdout > 0;
- $inmask = POLLIN unless length $to_socket >= MAXBUF or ($socket_done || $stdin_done);
- $socketmask = POLLOUT unless length $to_socket == 0 or $socket_done;
- $socketmask |= POLLIN unless length $to_stdout >= MAXBUF or $socket_done;
- $poll->mask(\*STDIN => $inmask);
- $poll->mask(\*STDOUT => $outmask);
- $poll->mask($socket => $socketmask);
- $socket->shutdown(1) if $stdin_done and !length($to_socket);
- }
复制代码
[ 本帖最后由 sunrie 于 2007-1-23 10:01 编辑 ] |
|