Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets 套接字编程最佳实践?_Sockets_Tcp - Fatal编程技术网

Sockets 套接字编程最佳实践?

Sockets 套接字编程最佳实践?,sockets,tcp,Sockets,Tcp,我正在设计一个文件同步应用程序(比如DropBox)。客户端在端口443上与服务器保持一个持久安全(SSL)TCP套接字。每当在客户端上创建/更改/删除文件时,都会通过套接字将包含相关数据的数据包发送到服务器,服务器会对其进行处理以更新服务器上的文件。类似地,当服务器上发生更改时,它会将相关数据发送到客户端,然后客户端会更新本地副本 当服务器位于本地计算机上或本地LAN上时,这是绝对正常的。我担心的是当客户端位于不可靠的网络上时/P> 例如,假设在客户端上创建文件时,客户端是否应将数据发送到服务

我正在设计一个文件同步应用程序(比如DropBox)。客户端在端口443上与服务器保持一个持久安全(SSL)TCP套接字。每当在客户端上创建/更改/删除文件时,都会通过套接字将包含相关数据的数据包发送到服务器,服务器会对其进行处理以更新服务器上的文件。类似地,当服务器上发生更改时,它会将相关数据发送到客户端,然后客户端会更新本地副本

当服务器位于本地计算机上或本地LAN上时,这是绝对正常的。我担心的是当客户端位于不可靠的网络上时<那么,我的问题是,在设计这样一个应用程序时,最好的实践是什么,需要考虑的问题是什么?>/P> 例如,假设在客户端上创建文件时,客户端是否应将数据发送到服务器并将其忘记,或者是否应在某个时间段内等待服务器的确认,如果失败,则再次发送数据?什么样的承认

客户端与服务器保持一个持久安全(SSL)TCP套接字

[……]

客户机应该只是将数据发送到服务器并忘记它,还是应该在某个时间段内等待服务器的确认,如果失败,则再次发送数据

如果使用UDP,则必须这样做。但是,既然您使用的是TCP,那么您已经完成了所有这些


您应该知道,TCP是一种面向流的协议,因此您的数据可能不会以与发送数据相同的方式到达(即,它可能一次到达一个字节,或者一次到达所有字节)。

TCP消除了许多网络问题:数据包总是按顺序到达,如果服务器不确认已收到数据包,则会重新发送数据包。不可靠的网络将导致通信速度变慢,因为必须重新发送数据包


如果连接仍然丢失,则read()和write()调用将返回错误返回值,因此您必须处理该错误。

即使服务器是本地主机,也应使用确认。假设在发送信息时出现某种连接问题。您需要某种方法来了解操作的结果(例如,使用确认系统)


我会使用比简单的ACK/NACK回复更复杂的东西。例如,如果更改了客户端中的某些文件,则在将信息从客户端发送到服务器后,服务器应回复受更新操作影响的文件的编号(或带有名称的列表)。通过这种方式,客户可以验证一切正常,或据此采取行动。

实际上不是这样。您不知道另一端的应用程序层是否一切正常,只是因为TCP没有出错。e、 g.服务器端可能会耗尽磁盘空间,它可能会在客户端发送最后一个字节时崩溃,但在最后一个字节到达服务器应用程序之前,以及其他一些您可能需要关心的特定于应用程序的内容。这超出了“套接字编程”的范围,不是吗?谢谢大家的评论,对我对Sjoerd上述回答的评论有任何回应吗?哦,那很好。所以我不需要担心丢失的数据包。但我想我仍然需要在应用层发送确认,如下面答案的注释中提到的“否”。因此,我的应用程序应该继续将数据推送到套接字,而不必担心任何事情。例如,假设客户端必须向服务器发送一个10 GB的文件,而连接速度非常慢。应用程序是否应该继续将数据写入输出缓冲区?如果网络速度慢,缓冲区不会溢出吗?如果使用类似的方法,它将返回它设法写入的字节数。然后,您可以轮询FD的写准备情况,并尝试再写一些。@Tarandeep如果您使用TCP,它将自动管理速度。@Tarandeep Gill TCP具有流量控制,因此缓冲区不会溢出。您的read()/write()调用将被阻塞(可能是永远的,除非您非常小心),直到数据可以发送为止,或者如果您的套接字是非阻塞的,write()将失败并告诉您缓冲区此时已满。