记录一个使用socket库中遇到的问题,最近项目中遇到使用本地udp通信的情况,在编写程序过程中,发现调用recvfrom一直失败,返回-1,错误码10022(错误码很重要)。
排查了半个下午,终于发现原来是bind函数的问题。由于在文件开头使用了 using namespace std 导致默认的bind变成了 functional中的那个,而不是socket的bind,导致绑定一直没有成功。当然,也可能是套接字端口被占用,recvfrom直接返回-1(但运行不报错),错误码是10044和10022(放在不同地方)。解决方法就是,换一个端口。
解决方案:
-
不要在文件中用 using namespace std
-
使用 ::bind()
-
换端口
原文链接:https://blog.csdn.net/tudouttttt/article/details/108026921
要求是:设备与主机之间是
UDP
通信,当刷新设备时,需要释放socket资源,然后再新建socket资源。(没有设置socket的地址重用属性,因为要防止会带来其他的隐患,比方说接收到旧的错误消息)
sock为类成员变量
port也为类成员变量
(一些错误校验都省略了)
第一个版本:
bool InitSocket()
sock = socket(AF_INE
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero((char *)&ca, sizeof(ca));
ca.sin_family = AF_INET;
ca.sin_addr.s_addr = htonl(INADDR_ANY);
ca.sin_port = htons(SERV_
1、问题描述
在没有
网络
数据的情况下执行
recv
from()函数,程序没有进入阻塞等待,而是直接
返回
-1。上网搜索相关问题的解决方法,主要集中在
recv
from()函数的参数没有匹配。
2、解决方法
struct sockaddr address;
int len=0;
int iResult =
recv
from(socket,data,sizeof(data),0,&address,&len);
解决方法:(int len = sizeof(addr...
从套接字上接收一个消息。对于
recv
from ,可同时应用于面向连接的和无连接的套接字。
recv
一般只用在面向连接的套接字,几乎等同于
recv
from,只要将
recv
from的第五个参数设置NULL。
如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。
假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。