linux - 无法在 Perl 中设置 TCP_NODELAY - 关于权限的错误 - 为什么? (但我可以在 python 和 ruby​​ 中设置)

标签 linux perl networking tcp

我正在尝试在我的套接字中设置 TCP_NODELAY。这是 Perl 中的一个示例。

use Socket qw(TCP_NODELAY);
use IO::Socket::INET;

my $socket = IO::Socket::INET->new('localhost:8087');

die "Error ($!), can't connect to $host:$port"
  unless defined $socket;

$socket->sockopt(TCP_NODELAY, 1) 
  or die "Cannot set tcp nodelay $! ($^E)";

这是结果(使用我的代码和其他示例,以及有关我的环境的一些详细信息):

$ perl z.pl
Cannot set tcp nodelay Permission denied (Permission denied) at z.pl line 9.

$ ruby z.rb
#<Socket::Option: INET TCP NODELAY 1>

$ python z.py
1

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

$ perl -v
This is perl 5, version 12, subversion 2 (v5.12.2) built for x86_64-linux

$ python --version
Python 2.7.5+

$ uname -a
Linux tpecze-desktop 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

我真的不知道为什么我不能设置这个标志。有人有什么想法吗?我的环境中应该有一些细节吗?我尝试使用 Perl 5.18.1 得到相同的结果:(

python 例子

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost",8087))
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
print s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY)

ruby 示例

require 'socket'

s = TCPSocket.new('localhost', 8087)
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
puts s.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY).inspect

最佳答案

我的错,我应该用

$socket->setsockopt(IPPROTO_TCP, TCP_NODELAY, 1) 

不是sockopt

关于linux - 无法在 Perl 中设置 TCP_NODELAY - 关于权限的错误 - 为什么? (但我可以在 python 和 ruby​​ 中设置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976905/

相关文章:

perl - 使用或不使用 namespace::sweep 和/或 Modern::Perl

mysql - DBD::mysql fetchrow_array 失败:没有 execute() 的 fetch()?

c# - TcpClient 性能 - 发送 4 个标量值比发送包含所有值的 1 个字节数组慢得多

python - 是否有 Python 库可以模拟来自不同地址的网络流量

networking - 使用 nc (netcat) 广播消息

linux - 使用 --device 标志时,在主机上创建的新设备节点不会反射(reflect)在 Docker 容器中

linux - 使用 Linux binutils 设置 ELF 镜像基地址的优雅方法?

c - 为什么要分两步进行位移?

linux - 绑定(bind) Monit 使用端口 443

linux - 为什么我的自定义 Perl 不能安装到预期的目录中?