免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3126 | 回复: 3
打印 上一主题 下一主题

Windows下Socket编程与Linux下主要有哪些区别? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 10:00 |只看该作者 |倒序浏览
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客户端!

  1. #!/usr/bin/perl -w
  2. # file gab7.pl
  3. # usage: gab7 [host] [port]

  4. use strict;
  5. use warnings;
  6. use IO::Socket;
  7. use IO::Poll;
  8. use Errno qw(EWOULDBLOCK);
  9. use constant MAXBUF => 8192;

  10. $SIG{PIPE} = 'IGNORE';

  11. my ($to_stdout, $to_socket, $stdin_done, $socket_done) = ('', '', 0, 0);

  12. my $host = '202.102.197.65';
  13. my $port = '5555';
  14. my $socket = IO::Socket::INET->new("$host:$port") or die $@;

  15. my $poll = IO::Poll->new() or die "Can not create IO::Poll Object";
  16. $poll->mask(\*STDIN => POLLIN);
  17. $poll->mask($socket => POLLIN);

  18. $socket->blocking(0);
  19. STDOUT->blocking(0);

  20. while ($poll->handles) {
  21.         $poll->poll();

  22.         for my $handle ($poll->handles(POLLIN|POLLHUP|POLLERR)) {
  23.                 if ($handle eq \*STDIN) {
  24.                         $stdin_done++ unless sysread(STDIN, $to_socket, MAXBUF, length $to_socket);
  25.                 }
  26.                 elsif ($handle eq $socket) {
  27.                         $socket_done++ unless sysread($socket, $to_stdout, MAXBUF, length $to_stdout);
  28.                 }
  29.         }

  30.         for my $handle ($poll->handles(POLLOUT|POLLERR)) {
  31.                 if ($handle eq \*STDOUT) {
  32.                         my $bytes = syswrite(STDOUT, $to_stdout);
  33.                         unless ($bytes) {
  34.                                 next if $! == EWOULDBLOCK;
  35.                                 die "write to stdout failed: $!";
  36.                         }
  37.                         substr($to_stdout, 0, $bytes) = '';
  38.                 }
  39.                 elsif ($handle eq $socket) {
  40.                         my $bytes = syswrite($socket, $to_socket);
  41.                         unless ($bytes) {
  42.                                 next if $! == EWOULDBLOCK;
  43.                                 die "write to socket failed: $!";
  44.                         }
  45.                         substr($to_socket, 0, $bytes) = '';
  46.                 }
  47.         }
  48. } continue {
  49.         my ($outmask, $inmask, $socketmask) = (0, 0, 0);

  50.         $outmask = POLLOUT if length $to_stdout > 0;
  51.         $inmask = POLLIN unless length $to_socket >= MAXBUF or ($socket_done || $stdin_done);
  52.         $socketmask = POLLOUT unless length $to_socket == 0 or $socket_done;
  53.         $socketmask |= POLLIN unless length $to_stdout >= MAXBUF or $socket_done;

  54.         $poll->mask(\*STDIN => $inmask);
  55.         $poll->mask(\*STDOUT => $outmask);
  56.         $poll->mask($socket => $socketmask);

  57.         $socket->shutdown(1) if $stdin_done and !length($to_socket);
  58. }
复制代码

[ 本帖最后由 sunrie 于 2007-1-23 10:01 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-01-23 10:07 |只看该作者
在 Win32 下,
IO::Select 我用过,没问题的。
IO:oll 我没用过,也许是 Win32 平台不支持 poll?

论坛徽章:
0
3 [报告]
发表于 2007-01-23 10:37 |只看该作者
能不能给个用IO::Select的例子呀,我用IO::Select总是不行,又找不到原因,痛苦中!!!

论坛徽章:
0
4 [报告]
发表于 2007-01-23 10:49 |只看该作者

  1. for ($sock1, $sock2) {
  2.     binmode;
  3.     $_->autoflush(1);
  4.     $_->blocking(0);
  5. }

  6. my $sel = new IO::Select($sock1, $sock2);
  7. while (1)
  8. {
  9.     my @ready = $sel->can_read(2);
  10.     foreach $sock (@ready) {
  11.         if ($sock == $sock1) {
  12.             ...
  13.         }
  14.        elsif ($sock == $sock2)
  15.        {
  16.             ...
  17.        }
  18.     }
  19. }

  20. $_->close for ($sock1, $sock2);
复制代码

[ 本帖最后由 legend9 于 2007-1-23 10:51 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP