TCP套接字问题

use*_*232 2 sockets tcp

我开始从互联网学习TCP协议并进行一些实验.在我阅读http://www.diffen.com/difference/TCP_vs_UDP上的文章后

"TCP更可靠,因为它在部件丢失的情况下管理消息确认和重传.因此绝对没有丢失的数据."

然后我做我的实验,我用TCP套接字写了一段代码:

while( ! EOF (file))
{
   data = read_from(file, 5KB); //read 5KB from file
   write(data, socket); //write data to socket to send
}
Run Code Online (Sandbox Code Playgroud)

我认为它很好,因为"TCP是可靠的",它"重传丢失的部分"......但它并不好.一个小文件可以,但是当它达到大约2MB时,有时它可以但不总是......

现在,我尝试另一个:

while( ! EOF (file))
{
   wait_for_ACK();//or sleep 5 seconds
   data = read_from(file, 5KB); //read 5KB from file
   write(data, socket); //write data to socket to send
}
Run Code Online (Sandbox Code Playgroud)

现在好了......

我能想到的是第一个因为以下原因而失败:1.发送器上的缓冲区溢出因为发送速率慢于程序的写入速率(发送速率由TCP控制)2.可能发送速率更高比写入速率,但一些数据包丢失(一些重传后,仍然失败,然后TCP放弃...)

有任何想法吗?谢谢.

650*_*502 5

TCP将确保您不会丢失数据,但您应该检查实际接受传输的字节数...典型的循环是

while (size > 0)
{
    int sz = send(socket, bufptr, size, 0);
    if (sz == -1) ... whoops, error ...
    size -= sz; bufptr += sz;
}
Run Code Online (Sandbox Code Playgroud)

send呼叫接受来自你的程序的一些数据时,操作系统的工作就是将其送到目的地(包括重传),但发送缓冲区可能小于你需要发送的大小,这就是结果sz(数量)接受传输的字节数可能小于size.

同样重要的是要考虑发送是异步的,即在send函数返回之后数据尚未在目的地,它只被分配给要传送的TCP传输系统.如果您想知道何时会收到,那么您将不得不使用其他系统(例如来自对方的回复消息).