TCP不可靠吗?
我相信TCP是可靠的。如果TCP不可靠吗?,c,sockets,tcp,C,Sockets,Tcp,我相信TCP是可靠的。如果write(socket,buf,buf_len)和close(socket)返回无误,则接收器将接收长度为buf_len的完全相同的buf数据 但是说TCP是不可靠的 A: B: int sock = socket(AF_INET, SOCK_STREAM, 0); bind(sock, &local, sizeof(local)); listen(sock, 128); int client=accept(sock, &local, locallen
write(socket,buf,buf_len)
和close(socket)
返回无误,则接收器将接收长度为buf_len
的完全相同的buf
数据
但是说TCP是不可靠的
A:
B:
int sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, &local, sizeof(local));
listen(sock, 128);
int client=accept(sock, &local, locallen);
write(client, "220 Welcome\r\n", 13);
int bytesRead=0, res;
for(;;) {
res = read(client, buffer, 4096);
if(res < 0) {
perror("read");
exit(1);
}
if(!res)
break;
bytesRead += res;
}
printf("%d\n", bytesRead);
不幸的是,正确的答案是D。但这怎么会发生呢?程序A
报告所有数据已正确发送
如果这篇文章是真的,我必须改变主意。但我不确定这篇文章是否属实
这篇文章是真的吗 TCP/IP提供了可靠性,这意味着它允许重新传输丢失的数据包,从而确保(最终)接收到所有传输的数据,或者您会收到超时错误。要么你的东西被送到了,要么你被告知超时错误 顺便说一句,TCP/IP在某种程度上是可靠的,它保证了网络正常工作时的传输。。。如果拔掉电缆,TCP/IP将无法传送数据包 请注意,您至少应将指针置于
缓冲区内
缓冲区内
void ReadXBytes(int socket, unsigned int x, void* buffer)
{
int bytesRead = 0;
int result;
while (bytesRead < x)
{
result = read(socket, buffer + bytesRead, x - bytesRead);
if (result < 1 )
{
// Throw your error.
}
bytesRead += result;
}
}
void ReadXBytes(整数套接字、无符号整数x、void*缓冲区)
{
int字节读取=0;
int结果;
while(字节读取
TCP是可靠的(至少当较低级别的协议是可靠的时),但是程序员可能以不可靠的方式使用它
这里的问题是,在另一端正确接收到所有发送的数据之前,不应关闭套接字:关闭信号可能会在最后一个数据仍在传输之前破坏连接
确保同伴正确接收的正确方法是
程序A报告所有数据都已正确发送
否。在程序A中返回write
仅意味着返回的字节数已传递到操作系统的内核。它并不声称数据已由本地系统发送,已由远程系统接收,甚至已由远程应用程序处理
我相信TCP是可靠的
TCP仅在传输层提供可靠性。这仅意味着它将确保检测到数据丢失(并重新传输数据包)、检测到数据重复(并丢弃重复数据)以及检测到并修复数据包重新排序
TCP不要求更高层次的可靠性。如果应用程序需要,则必须由应用程序本身提供 TCP/IP是可靠的,因为“可靠”一词的含义非常特殊(且有限) 具体地说,当write()返回1000000时,它向您做出以下承诺:
A) 1000000
B) something less than 1000000
C) it will exit reporting an error
D) could be any of the above
void ReadXBytes(int socket, unsigned int x, void* buffer)
{
int bytesRead = 0;
int result;
while (bytesRead < x)
{
result = read(socket, buffer + bytesRead, x - bytesRead);
if (result < 1 )
{
// Throw your error.
}
bytesRead += result;
}
}