Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Unix套接字编程是否确保没有传输损失,或者我是否必须在应用程序级别合并它?_C_Unix_Tcp - Fatal编程技术网

C Unix套接字编程是否确保没有传输损失,或者我是否必须在应用程序级别合并它?

C Unix套接字编程是否确保没有传输损失,或者我是否必须在应用程序级别合并它?,c,unix,tcp,C,Unix,Tcp,理论上,TCP/IP保证了交付。但实际上,如果服务器宕机或连接链路出现故障,那么如何确保所有需要发送的数据包都已发送? 另外,发送方如何知道哪些数据包已成功发送。 我正在尝试用C实现tcp协议。 在上一篇博客中,我读到send()函数只有在发送方出现问题时才会返回-1,而在传输失败时可能不会返回-1。此外,我还了解到,如果我将SO_SNDBUFR设置为数据包大小,则发送方将被阻止,直到收到ack。这是否正确?如果您使用send通过TCP套接字发送数据,并希望确认数据已成功传递,那么简短的回答是“

理论上,TCP/IP保证了交付。但实际上,如果服务器宕机或连接链路出现故障,那么如何确保所有需要发送的数据包都已发送? 另外,发送方如何知道哪些数据包已成功发送。 我正在尝试用C实现tcp协议。
在上一篇博客中,我读到send()函数只有在发送方出现问题时才会返回-1,而在传输失败时可能不会返回-1。此外,我还了解到,如果我将SO_SNDBUFR设置为数据包大小,则发送方将被阻止,直到收到ack。这是否正确?

如果您使用
send
通过TCP套接字发送数据,并希望确认数据已成功传递,那么简短的回答是“是”,您需要在应用程序级别执行此操作

一个简单的例子是让另一方像单个字节一样发送确认。因此,您在
send
之后添加了
recv
一个字节。这表明它已成功交付

这种逻辑很常见,例如,客户端应用程序可能会远程同步一些数据,需要尽快告诉用户一切都已完成


你可以在SO上找到一些类似的问题,比如。

没有一种插座可以确保传输损耗。只有保证级别

例如,在TCP(一种假定的有保证的传输系统)中,如果发生网络中断,可能需要几分钟后系统才会通知接收方发生了这种情况。即使如此,也只有在发生某些事件引起系统注意时才会发生这种情况,例如:收件人尝试向服务器发送内容,或者心跳已启用(默认情况下关闭),并且心跳超时已过

因此,每个系统都需要一种机制来从传输错误和任何相关数据丢失中恢复。

即使发送的数据包被发送,并且被接收机器确认为已接收,接收应用程序也可能在处理它们之前崩溃

如果每个数据包在应用程序级都很重要,那么必须提供应用程序级协议以确保它们被接收

在您的情况下,听起来您可能需要某种消息排队系统


同样的逻辑也适用于OSI堆栈的第二层:如果你想确保一个人看到了你的消息,你必须得到这个人的确认。“已读回执”是由邮件程序发送的,并不意味着某人已读过,更不用说理解了。

如果您正在与之通信的服务器出现故障,则您可能需要考虑其他问题。不,您不会丢失您尝试发送的任何消息,因为TCP将确保您在尝试发送时返回错误,因此您仍然拥有数据,并且可以在重新建立通信后重试。请注意术语-“Unix套接字”是一种特殊类型的套接字,不是TCP/IP套接字!只要设计/编码你需要的任何东西。查看TCP上分层的现有协议的设计,看看它通常是如何完成的。(换句话说,是的,在应用程序级别上进行。)我在哪里可以找到在C中实现消息队列系统的基础知识?有许多库用于此,但在不知道您在做什么的情况下,我不能推荐任何课程,甚至不能肯定这是一门合适的课程。