[英]Linux UDP sendto “Bad address” error in local
I am trying to code UDP with two thread. 我正在尝试使用两个线程对UDP进行编码。
First init UDP sockets 首次初始化UDP套接字
int fdPipe[2]; //for sockets
if ((fdPipe[0] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("cannot create socket");
assert(NULL);
}
struct sockaddr_in readAddr;
memset((char *)&readAddr, 0, sizeof(readAddr));
readAddr.sin_family = AF_INET;
readAddr.sin_addr.s_addr = htonl(INADDR_ANY);
readAddr.sin_port = htons(10000);
if (bind(fdPipe[0], (struct sockaddr *)&readAddr, sizeof(readAddr)) < 0) {
perror("bind failed");
assert(NULL);
}
if ((fdPipe[1] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("cannot create socket");
assert(NULL);
}
struct sockaddr_in writeAddr;
memset((char *)&writeAddr, 0, sizeof(writeAddr));
writeAddr.sin_family = AF_INET;
writeAddr.sin_addr.s_addr = htonl(INADDR_ANY);
writeAddr.sin_port = htons(10101);
if (bind(fdPipe[1], (struct sockaddr *)&writeAddr, sizeof(writeAddr)) < 0) {
perror("bind failed");
assert(NULL);
}
And address for sendto() 和sendto()的地址
struct sockaddr_in servAddr;
memset((char *)&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
int rtnVal = inet_pton(AF_INET, "127.0.0.1", &servAddr.sin_addr.s_addr);
if(rtnVal == 0){assert(NULL);}
servAddr.sin_port = htons(10000);
servAddr.sin_family = AF_INET;
And then run another thread to communicate each other. 然后运行另一个线程以相互通信。
But when i call sentto with servAddr
from fdPipe[1]
to fdPipe[0]
, bad address error appear. 但是,当我使用
servAddr
从fdPipe[1]
到fdPipe[0]
调用sendto时,出现错误的地址错误。 Event when i check address and port number with printing, it appear to be correct, like IP:127.0.0.1 Port:10000
当我通过打印检查地址和端口号时,该事件似乎是正确的,例如
IP:127.0.0.1 Port:10000
char event = '1'
std::cout << "port: " << ntohs(servAddr.sin_port) << std::endl;
std::cout << "IP: " << inet_ntoa(servAddr.sin_addr) << std::endl;
sendto(fdPipe[1], (const char*)(event), 1, 0,(struct sockaddr *)&servAddr,sizeof(servAddr));
e Ë
You're casting event
from a char to a pointer, not taking the address of event which is what you probably mean to do. 您正在将
event
从char转换为指针,而不是获取事件的地址 ,这可能就是您想做的。
Your sendto line should be something like; 您的sendto线路应类似于:
sendto(fdPipe[1], &event, 1, 0,(struct sockaddr *)&servAddr,sizeof(servAddr));
A tip would be to enable all warnings in your compiler, that would probably have caught the suspicious cast. 提示是启用编译器中的所有警告,这可能已引起可疑的转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.