可以在数据报套接字中使用发送和接收吗?
Posted
技术标签:
【中文标题】可以在数据报套接字中使用发送和接收吗?【英文标题】:Is it ok to use in both datagram socket for send and received? 【发布时间】:2012-09-25 10:45:00 【问题描述】:我的 MasterSlaveSynchronize 类用于发送和接收心跳。 是否可以只有一个数据报套接字同时用于发送和接收?
下面的2个方法可以定时运行,也可以同时运行。
void MasterSlaveSynchronize::sendHearBeat()
const int HEARBEAT_LEN = 1;
const char HEARBEAT[1] = '1' ;
int n = sendto(sock, HEARBEAT, HEARBEAT_LEN, 0,(const struct sockaddr *) &target_, length_);
if (n < 0)
printf("Sendto"); //TODO ERR
void MasterSlaveSynchronize::recivedHearBeat()
char buf[1024];
if (bind(sock, (struct sockaddr *) &this_, length_) < 0)
printf("binding"); //TODO err
while (1)
int n = recvfrom(sock, buf, 1024, 0, (struct sockaddr *) &target_,&length_);
if (n < 0)
printf("recvfrom"); //TODO ER
//TODO update got hearbeat
【问题讨论】:
【参考方案1】:是的,对sendto
和recvfrom
使用相同的套接字很好(确实是预期的)。
但是,您的 recivedHearBeat()
函数永远不会退出。没关系,如果它在单独的线程中运行。
【讨论】:
是的,确保它在不同的线程中运行。该类既用作发送心跳的客户端,也用作接收心跳的服务器。可以使用相同的端口进行发送和接收吗?最后一个(也是愚蠢的)-套接字的dosnt绑定将其绑定到特定用途(ip,端口)? 是的,bind
确实使套接字特定于一个(ip,端口),然后用于发送和接收。 bind
需要在调用 sendto
函数之前发生。
但是对于 sendHearBeat 我不需要使用绑定。
@user1495181 不,一旦在套接字上完成,它就会在两个方向上应用。
我根本不需要它来从客户端发送到服务器。我可以使用 sendHearBeat 方法,只创建没有任何绑定的套接字,它将作为客户端工作。以上是关于可以在数据报套接字中使用发送和接收吗?的主要内容,如果未能解决你的问题,请参考以下文章
流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较
如何拆分接收到的 boost asio udp 套接字联合数据报
socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。