sendto是什么意思

跨境快讯 2023-07-14 00:00:42 woniu
6
SendTo

sendto() 用来将数据由指定的socket传给对方主机。
参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。
参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。
参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。
参数tolen为sockaddr的结构长度。
返回值 成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。
错误代码 EBADF 参数s非法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间。
ENOTSOCK 参数 s为一文件描述词,非socket。
EINTR 被信号所中断。

sendmsg

send,sendto以及sendmsg系统调用用于发送消息到另一个套接字。
send函数在套接字处于连接状态时方可使用。
而sendto和sendmsg在任何时候都可使用 。
sendmsg介绍 send,sendto,sendmsg方法用于从套接字发送消息。
send,sendto以及sendmsg系统调用用于发送消息到另一个套接字。
send函数在套接字处于连接状态时方可使用。
而sendto和sendmsg在任何时候都可使用。
演示用法 下面的代码片段演示了send,sendto,sendmsg函数的用法:

UDP客户端使用connect()绑定一个地址和端口后,服务端收到此客户端的数据时发现端口号错误?

我自己来回答一下吧! 我知道connect和bind的区别了。
哎,昨晚头脑发热,没能理解书上两段话的意思。
最近在看《TCP/IP网络编程》一书,在讲到UDP编程时,书上先是说: UDP中,调用sendto函数前应完成对套接字地址的分配工作,因此调用bind函数......另外,如果调用sendto函数时发现尚未分配地址信息,则在首次调用sendto时会给相应套接字自动分配IP和端口,而且此时分配的地址一直保留到程序结束为止,因此也可用来与其他UDP套接字进行数据交换。
当然,IP用本主机IP,端口号随意选择一个尚未使用的端口号。
然后书上后面又有一个地方说: 通过sendto函数传输数据的过程大致分为三个阶段:- 第一阶段:向UDP套接字注册目标IP和端口号; - 第二阶段:传输数据; - 第三阶段:删除UDP套接字中注册的目标地址和端口号。
并且上述三个过程在每次调用sendto函数时都会发生,这样就很浪费时间。
因此可以通过创建已连接UDP套接字来实现注册地址信息,也就是通过connect来注册地址信息。
由于是刚学网络编程,因此看过之后,很懵圈,一个地方说在第一次调用sendto时就会注册,一个地方说每次调用sendto时都会重新注册。
睡完一觉,终于领悟了,书上说的原来是两种地址,一个是本机地址,一个是目标地址。
书上说在第一次调用sendto函数前会注册一个地址,这个是指的本机IP和端口。
给一个socket注册本机IP和端口使用的是bind函数,而不是connect函数。
书上说每次调用sendto时都会重新注册地址,这里说的地址是指目标IP和端口。
同样,给一个socket注册目标IP和端口用的是connect函数。
因此,一个socket是同时包含两个地址的,一个是目标地址,一个是本机地址。
注册目标地址使用connect,注册本机地址使用bind。
如果不注册目标地址,则在每次调用sendto函数时都会自动注册进去然后再自动解除。
如果不是先注册本机地址,则在第一次调用sendto时就会自动注册一个本机地址,且一直存在,不会主动解除。
其实不管在TCP中还是UDP中,connect不仅可以注册目标地址,在第一次调用connect的时候,还会注册本机地址(选一个可用的本机IP以及一个可用的端口自动注册,无需程序员指定)。
一个socket的目标地址可以重复注册多次,但是本机地址只能注册一次,要么显式地使用bind注册一次,要么在第一次调用sendto函数(UDP)或者第一次调用connect()函数(TCP或UDP)时隐式地注册进去。
还有,在UDP中通过sendto发送数据时,因为始终要传入目标服务器的地址,所以此时传入sendto的socket所绑定的目标地址出错,也不会有问题,目标服务器仍然能够接受到数据,只不过此时如果目标服务器发送一个应答数据,则由于客户端会使用recvfrom来接收数据,并且虽然也传入了一个sockaddr参数,但是这个参数是用于接收的,recvfrom函数所接收的目标是sock中所绑定的目标地址。
因为你设置的不正确,所以recvfrom是接收不到目标服务器返回来的数据的。
对于recvfrom函数,如果传入的socket中注册了目标地址,则此函数只能接收目标地址发来的数据。
如果socket中的目标地址未注册,或者注册为0.0.0.0::0,则表示此函数可以接收任意IP任意端口发来的数据;如果此socket的本机IP不为0.0.0.0,则表示只会在指定的IP上进行监听,如果本机IP指定为0.0.0.0,则表示在本机的任意可用的IP上进行监听。
在UDP客户端中使用connect事先绑定目标地址还有一个好处,就是发送数据和接收数据可以不再使用sendto函数和recvfrom函数了,可以直接使用send和recv函数,或者使用write和read函数(linux下)。
最后,如何从一个socket文件描述符中获取其所绑定的目标IP和本机IP? 函数getpeername可以获取目标IP和目标端口; 函数getsockname可以获取本socket所使用的IP和端口。
哎,还是相关知识太少,等后面学的深入一点,可能这些问题就根本不是啥问题了!

UDP的sendto过快导致发送失败,应该怎么办?

UDP的sendto过快导致发送失败,应该怎么办?在写一个关于网络多播的代码时,sendto发送过快导致发送失败,WSAGetLastError() 为WSAEWOULDBLOCK,应该怎么办呢? 网…显示全部

版权声明: woniu 发表于 2023-07-14 00:00:42。
转载请注明: sendto是什么意思 | 跨境湾

相关文章