沈阳海外模板建站,电商的网站,合川网站建设公司,超级装家装官网一个包没有固定长度#xff0c;以太网限制在46#xff0d;1500字节#xff0c;1500就是以太网的MTU#xff0c;超过这个量#xff0c;TCP会为IP数据报设置偏移量进行分片传输#xff0c;现在一般可允许应用层设置8k#xff08;NTFS系统#xff09;的缓冲区#xff0c;…一个包没有固定长度以太网限制在461500字节1500就是以太网的MTU超过这个量TCP会为IP数据报设置偏移量进行分片传输现在一般可允许应用层设置8kNTFS系统的缓冲区8k的数据由底层分片而应用层看来只是一次发送。而
windows的缓冲区经验值是4k。Socket本身分为两种流(TCP)和数据报(UDP)你的问题针对这两种不同使用而结论不一样。甚至还和你是用阻塞、还是非阻塞Socket来编程有关。1、通信长度这个是你自己决定的没有系统强迫你要发多大的包实际应该根据需求和网络状况来决定。对于TCP这个长度可以大点但要知道Socket内部默认的收发缓冲区大小大概是8K你可以用SetSockOpt来改变。但对于UDP就不要太大一般在1024至10K。注意一点你无论发多大的包IP层和链路层都会把你的包进行分片发送一般局域网就是1500左右广域网就只有几十字节。分片后的包将经过不同的路由到达接收方对于UDP而言要是其中一个分片丢失那么接收方的IP层将把整个发送包丢弃这就形成丢包。显然要是一个UDP发包佷大它被分片后链路层丢失分片的几率就佷大你这个UDP包就佷容易丢失但是太小又影响效率。最好可以配置这个值以根据不同的环境来调整到最佳状态。send()函数返回了实际发送的长度在网络不断的情况下它绝不会返回(发送失败的)错误最多就是返回0
。对于TCP你可以写一个循环发送。当send函数返回SOCKET_ERROR时才标志着有错误。但对于UDP你不要写循环发送否则将给你的接收带来极大的麻烦。所以UDP需要用SetSockOpt来改变Socket内部Buffer的大小以能容纳你的发包。明确一点TCP作为流发包是不会整包到达的而是源源不断的到那接收方就必须组包。而UDP作为消息或数据报它一定是整包到达接收方。2、关于接收一般的发包都有包边界首要的就是你这个包的长度要让接收方知道于是就有个包头信息对于TCP接收方先收这个包头信息然后再收包数据。一次收齐整个包也可以可要对结果是否收齐进行验证。这也就完成了组包过程。UDP那你只能整包接收了。要是你提供的接收Buffer过小TCP将返回实际接收的长度余下的还可以收而UDP不同的是余下的数据被丢弃并返回WSAEMSGSIZE错误。注意TCP要是你提供的Buffer佷大那么可能收到的就是多个发包你必须分离它们还有就是当Buffer太小而一次收不完Socket内部的数据那么Socket接收事件(OnReceive)可能不会再触发使用事件方式进行接收时密切注意这点。这些特性就是体现了流和数据包的区别。补充一点接收BuffSize 发送BuffSize 实际发送Size对于内外部的Buffer都适用上面讲的主要是Socket内部的Buffer大小关系。3、TCP是有多少就收多少如果没有当然阻塞Socket的recv就会等直到有数据非阻塞Socket不好等而是返回WSAEWOULDBLOCK。UDP如果没有数据阻塞Socket就会等非阻塞Socket也返回WSAEWOULDBLOCK。如果有数据它是会等整个发包到齐并接收到整个发包才返回。