我正在尝试用两个线程编写UDP代码。
第一个init 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);
}
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;
然后运行另一个线程来相互通信。
但是当我使用servAddr
从fdPipe[1]
拨打发送到fdPipe[0]
时,会出现错误的地址错误。
当我通过打印检查地址和端口号时,它似乎是正确的,如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));
ë
答案 0 :(得分:2)
您正在将event
从字符转换为指针,而不是将地址转换为您可能想要做的事件。
你的sendto行应该是这样的;
sendto(fdPipe[1], &event, 1, 0,(struct sockaddr *)&servAddr,sizeof(servAddr));
提示将启用编译器中的所有警告,这可能会引发可疑的演员。