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

时间:2014-10-15 04:00:49

标签: c linux udp

我正在尝试用两个线程编写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;

然后运行另一个线程来相互通信。

但是当我使用servAddrfdPipe[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));

ë

1 个答案:

答案 0 :(得分:2)

您正在将event从字符转换为指针,而不是将地址转换为您可能想要做的事件。

你的sendto行应该是这样的;

sendto(fdPipe[1], &event, 1, 0,(struct sockaddr *)&servAddr,sizeof(servAddr));

提示将启用编译器中的所有警告,这可能会引发可疑的演员。