问关于基于TCP和UDP的socket编程的区别

时间:2021-01-24 10:14:46
基于TCP和UDP的socket编程,recvfrom一次从底层TCP缓冲区或UDP缓冲区接收的数据(包)大小是多少?一个是字节流,一个是数据包?都是在recvfrom里指定字节参数来决定?

我看到程序,好像对recvfrom接收到的数据只当一个消息处理。当然,recvfrom的调用是由外层循环调用的,但还是有可能底层TCP或UDP缓冲区来的消息个数在下次循环调用recvfrom之前大于1个的吧?

5 个解决方案

#1


基于TCP和UDP的socket编程,recvfrom一次从底层TCP缓冲区或UDP缓冲区接收的数据(包)大小是多少?一个是字节流,一个是数据包?都是在recvfrom里指定字节参数来决定?
___________________________________________________________________________
recvfrom是接收UDP协议的数据,recv是接收你TCP协议的数据,收到数据包的大小,取决于

系统缓冲区数据的多少,你接收的缓冲区的大小和IP包的大小,接收到的数据取消于他三个

中最小的一个。



我看到程序,好像对recvfrom接收到的数据只当一个消息处理。当然,recvfrom的调用是由外层循环调用的,但还是有可能底层TCP或UDP缓冲区来的消息个数在下次循环调用recvfrom之前大于1个的吧?
——————————————————————————
没看懂

#2


UDP的recvfrom和TCP的recv是一样的?都是在“应用程序开辟的缓冲区大小”、“底层接收缓冲区大小”及“实际接收的IP包的大小”三者中的最小者?

我上面的意思是说:比如UDP的recv,这是在应用程序的while循环里调用的,每隔几秒调一次;按上面说的,每次recv有可能是多个IP包,但看到应用程序好像对一次recv调用接收的数据只作为一个包处理就完了,这样应该有问题?

#3


我上面的意思是说:比如UDP的recv,这是在应用程序的while循环里调用的,每隔几秒调一次;按上面说的,每次recv有可能是多个IP包,但看到应用程序好像对一次recv调用接收的数据只作为一个包处理就完了,这样应该有问题?
______________________________________________________
是的,recv一般都放在while循环里,每接收一次都要作判断,一直接收到自已想要的数据量为

#4


接收一次有可能收到多个包啊,就是说应用程序还要进一步对收到的包进行逐一解析?以确认一次接收上报了多少个包?

#5


接收一次有可能收到多个包啊,就是说应用程序还要进一步对收到的包进行逐一解析?以确认一次接收上报了多少个包?
_________________________________________________________________
一次接收多个包是因为发送端连续发了几个小于最大IP包的小包,系统为了效力,将这些包组成

一个较大的包一起发送出去,网络之间的通信,要先确定好通信协议,在协议里确定本次接收包

的大小,我一般都是这么做的。

#1


基于TCP和UDP的socket编程,recvfrom一次从底层TCP缓冲区或UDP缓冲区接收的数据(包)大小是多少?一个是字节流,一个是数据包?都是在recvfrom里指定字节参数来决定?
___________________________________________________________________________
recvfrom是接收UDP协议的数据,recv是接收你TCP协议的数据,收到数据包的大小,取决于

系统缓冲区数据的多少,你接收的缓冲区的大小和IP包的大小,接收到的数据取消于他三个

中最小的一个。



我看到程序,好像对recvfrom接收到的数据只当一个消息处理。当然,recvfrom的调用是由外层循环调用的,但还是有可能底层TCP或UDP缓冲区来的消息个数在下次循环调用recvfrom之前大于1个的吧?
——————————————————————————
没看懂

#2


UDP的recvfrom和TCP的recv是一样的?都是在“应用程序开辟的缓冲区大小”、“底层接收缓冲区大小”及“实际接收的IP包的大小”三者中的最小者?

我上面的意思是说:比如UDP的recv,这是在应用程序的while循环里调用的,每隔几秒调一次;按上面说的,每次recv有可能是多个IP包,但看到应用程序好像对一次recv调用接收的数据只作为一个包处理就完了,这样应该有问题?

#3


我上面的意思是说:比如UDP的recv,这是在应用程序的while循环里调用的,每隔几秒调一次;按上面说的,每次recv有可能是多个IP包,但看到应用程序好像对一次recv调用接收的数据只作为一个包处理就完了,这样应该有问题?
______________________________________________________
是的,recv一般都放在while循环里,每接收一次都要作判断,一直接收到自已想要的数据量为

#4


接收一次有可能收到多个包啊,就是说应用程序还要进一步对收到的包进行逐一解析?以确认一次接收上报了多少个包?

#5


接收一次有可能收到多个包啊,就是说应用程序还要进一步对收到的包进行逐一解析?以确认一次接收上报了多少个包?
_________________________________________________________________
一次接收多个包是因为发送端连续发了几个小于最大IP包的小包,系统为了效力,将这些包组成

一个较大的包一起发送出去,网络之间的通信,要先确定好通信协议,在协议里确定本次接收包

的大小,我一般都是这么做的。