小编lxg*_*xgr的帖子

send()后直接关闭()套接字:不安全?

close()最后一个套接字后是否明智/安全send()

我知道即使在关闭套接字之后,TCP也应该尝试在发送缓冲区中提供所有剩余数据,但是我真的可以依靠它吗?

我确保我的接收缓冲区中没有剩余数据,因此在关闭后不会发送任何RST.


在我的例子中,close实际上是调用之前的最后一个代码语句exit().

即使在发送数据的进程终止后,TCP堆栈是否会继续尝试传输数据?close()通过设置SO_LINGER,在调用之前自己等待任意超时是否可靠?

也就是说,应用相同的TCP超时,还是缩短?毕竟,使用大的发送缓冲区和慢速连接,实际传输所有缓冲数据的时间可能很长.


我对收到最后一个字节的通知并不感兴趣; 我只是希望他们最终尽可能可靠地到达远程主机.

应用程序层确认不是一个选项(协议是HTTP,我正在编写一个小型服务器).

sockets tcp

26
推荐指数
1
解决办法
2万
查看次数

何时以及如何中断系统调用?

是一个成功发送()"原子"的后续问题,我认为它实际上涉及系统调用,而不仅仅是发送套接字.

哪些系统调用可以中断,何时中断处理中断?我已经了解了SA_RESTART,但并不完全了解发生了什么.

  • 如果我在没有SA_RESTART的情况下进行系统调用,是否可以通过与我的应用程序无关的任何类型的中断(例如用户输入)来中断调用,但要求操作系统中止我的呼叫并执行其他操作?或者它只是被与我的进程直接相关的信号中断(CTRL + C,套接字关闭,......)?

  • 设置SA_RESTART时,send()或任何其他"慢"系统调用的语义是什么?它是否会一直阻塞,直到我的所有数据都被传输或套接字关闭,或者它是否能以小于send()参数中的计数的数字返回?

  • 重启的实施在哪里?操作系统是否知道我希望在任何中断时重新启动调用,或者是否有一些信号发送到我的进程然后由库代码处理?或者我必须自己做,例如在while循环中包装调用并根据需要重试?

linux system interrupt

16
推荐指数
1
解决办法
2万
查看次数

15
推荐指数
1
解决办法
3327
查看次数

如何告诉perl打印到文件句柄而不是打印文件句柄?

我试图绕过Perl处理参数解析的方式print.

为什么这样呢

print $fh $stufftowrite
Run Code Online (Sandbox Code Playgroud)

按预期写入文件句柄,但是

print($fh, $stufftowrite)
Run Code Online (Sandbox Code Playgroud)

文件句柄STDOUT代替?

我的猜测是它与文档中的警告有关print:

注意不要使用左括号跟随print关键字,除非您希望相应的右括号终止print的参数; 将括号括在所有参数周围(或插入一个+,但看起来不那么好).

我是否应该习惯第一种形式(这对我来说似乎不对,来自于所有使用围绕函数参数的括号的语言),还是有办法告诉Perl做我想做的事情?

到目前为止,我已经在第一个,第二个和两个参数周围尝试了很多括号组合,但没有成功.

perl

12
推荐指数
3
解决办法
8217
查看次数

Android N中的Java 8 Stream API

根据谷歌的介绍,从Android N开始,Android API应该支持Java流.

但是,使用Android N预览SDK,我无法在我的项目中使用任何Stream API(使用Android N配置为最低,目标和构建SDK版本).

这个java.util.stream包似乎缺失了,stream()我试过的所有集合实现的方法也是如此.

SDK的当前预览版中是否还包含必要的类?

java lambda android android-7.0-nougat

11
推荐指数
1
解决办法
2032
查看次数

正确关闭TCP套接字

"优雅地"关闭TCP套接字的推荐方法是什么?

我已经了解了read()之前close()ing在我的主机缓冲区中的所有剩余数据可能会导致远程主机出现问题(他可能会丢失已经被激活但尚未读取的接收缓冲区中的所有数据通过他的申请).那是对的吗?

什么是避免这种情况的好方法?有没有办法告诉API,由于忽略了任何剩余的缓冲数据并关闭套接字,我并不真正关心数据丢失?

或者我是否必须在应用程序协议级别考虑问题并使用某种隐式或显式"传输结束"信号让对方知道关闭套接字以进行读取是否安全?

sockets tcp

10
推荐指数
1
解决办法
2万
查看次数

使用select()时send()会阻塞吗?

当一个套接字通过调用发出信号表示可以写入时select(),如何知道我可以在不阻塞的情况下发送多少数据?(在完整发送缓冲区等的情况下)

包含在返回的集合中是否select()表示套接字已准备好至少一个字节的数据,然后将send()返回写入字节的短计数?

或者当我send()使用len大于可用缓冲区空间的参数调用时它会阻塞吗?如果是这样,我怎么知道最高金额?

我在Linux上使用常规C套接字.

c sockets select

8
推荐指数
1
解决办法
404
查看次数

解析树与字节码一样吗?

字节码和解析树之间究竟有什么区别,特别是Perl使用的那个?他们实际上是指同一个概念,还是有区别?

我熟悉Python和Java的字节码概念,但在阅读Perl时,我已经了解到它应该在其解释器中执行解析树(而不是字节码).

如果实际存在区别,Perl不使用字节码(或Python不使用解析树)的原因是什么?它主要是历史的,还是需要不同的编译/执行模型的语言之间存在差异?Perl(具有合理的努力和执行性能)可以通过使用字节码解释器来实现吗?

perl

8
推荐指数
2
解决办法
589
查看次数

IRI是否有效作为HTML属性值?

将包含非ASCII字符的IRI用作属性值(例如href属性)而不是URI,这是有效的HTML 吗?HTML风格(HTML和XHTML,4和5)之间是否有任何差异?至少RFC 3986似乎暗示它不是.

我意识到使用百分比编码可能更安全(关于旧的和不知道IRI的软件),但我正在寻找关于标准的确定答案.

到目前为止,我已经做了一些测试,与W3C验证,并在URI是不会触发与HTML 4/5和4/5 XHTML文档类型的任何警告或错误转义Unicode字符(当然没有错误消息没有按"意味着没有错误).

至少chrome还支持原始的UTF-8 IRI,但在触发HTTP请求之前,它们会逃脱它们.此外,我的Web服务器(lighttpd)似乎在HTTP请求中以百分比编码和未编码形式支持UTF-8字符.

html uri urlencode utf-8

8
推荐指数
1
解决办法
509
查看次数

lighttpd:禁用 CGI 缓冲

有没有办法阻止 lighttpd 将 POST 缓冲到 CGI 可执行文件?

在我看来,所有请求在转发到 CGI 可执行文件之前都已完全缓冲在磁盘上,这使我无法以基于流的方式处理输入。

澄清一下,我只是在谈论转发到标准输入上的 CGI 可执行文件的请求;我已经验证了响应没有像那样缓冲,并且流输出确实是可能的。

cgi lighttpd

6
推荐指数
1
解决办法
920
查看次数