UDP无法绑定插座
UDP unable to bind socket
i得到错误"无法绑定插座",错误:10038,尝试在不是插座的东西上尝试操作。插座会创建,但我无法绑定。
struct sockaddr_in serverAddress ; // declared as global
struct sockaddr_in clientAddress ; // declared as global
int len=sizeof(struct sockaddr); // declared as global
SOCKET s = NULL ; // declared as global
memset (& serverAddress , 0 , sizeof ( serverAddress ));
serverAddress.sin_family = AF_UNSPEC ;
serverAddress.sin_addr.s_addr =INADDR_ANY;
serverAddress.sin_port = htons(12345);
if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
{
printf (" Unable to create a socket n");
printf (" Failed with error : %dn%sn", WSAGetLastError () ,
gai_strerror ( WSAGetLastError ()));
exit (1);
}
else
{
std::cout<<"CREATED"<<std::endl;
}
if( bind(s,(struct sockaddr *)&serverAddress,sizeof(serverAddress)) < 0)
{
printf (" Unable to bind socket n");
printf (" Failed with error : %dn%sn", WSAGetLastError () ,
gai_strerror ( WSAGetLastError ()));
}
else
{
printf (" Bound to socket .n");
}
括号问题。
if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
应该是
if((s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)
在您的代码中,在您的行之后为0或1。
您需要修复此行:
if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
平等运算符(==
)首先执行,因此它会创建一个套接字并检查是否无效。但是,它永远不会将套接字信息分配给s
。相反,它分配了平等测试的布尔结果,这意味着s
可能设置为0
。
您要么需要放入括号以纠正执行顺序,要么只将作业移动到单独的语句中。为了可读性,我会推荐后者:
s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP);
if (s == INVALID_SOCKET)
{
...
值得注意的是,您的编译器可能会给您警告。它可能说的是"条件表达式中的分配"之类的话。您通常不应该忽略警告,因为它们可以帮助您捕获这样的微妙错误。
这没有分配给s,因此我永远不会得到插座号
if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
{
}
这是正确的方式
s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP);
if( s == INVALID_SOCKET )
{
echo "error";
}
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- 提升ASIO关闭绑定插座
- 打开NetLink插座将使用相同的PID,然后绑定和创建失败
- UDP无法绑定插座
- 绑定插座失败了ERRNO 88