简体   繁体   English

Linux UDP本地发送到“错误地址”错误

[英]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. 但是,当我使用servAddrfdPipe[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM