sendto 和 recvfrom 在同一个程序中?

sendto and recvfrom in the same program?

这是我第一次提问,也是第一次光靠搜索这个网站找不到答案。所以如果我做错了,请对我放轻松。 使用温索克。我需要发送和接收信息包到另一台计算机 运行 相同的程序。连接类型应该是 UDP(我猜是非阻塞?)并使用数据耦合模型。 我需要使用不同的线程发送和接收信息吗? 我知道数据发送得很好,但根本没有收到。

我可以很容易地进行程序发送和完全不同的程序接收,但这些原则似乎并没有延续到我正在尝试做的事情上。

我应该对 recvfrom 和 sendto 使用相同的 sockaddr_in 结构吗?或者他们可以使用同一个吗?斯伦怎么样?没关系,我都尝试过,work.I 都没有尝试过使用一个端口发送和接收一个端口,我尝试过使用一个端口来完成这两项操作。没有什么。我是 Winsock 的新手,如果我听起来很绝望或遗漏了一些非常明显的东西,我深表歉意。在这一点上,我真的需要一些帮助,或者至少在正确的方向上需要一点我不在乎有多少个端口,我只想看到 recv printf 传入正确的数据。

winsock 错误是 绑定失败 10048,接收失败 10022

我还要提到我研究了 MSDN 建议的一个名为 setsockopt 的概念,但它最终使我更加困惑。我错过了什么吗?

这里有一些相关的函数。

void UDPNetwork::initserver()
{
    initRemote();
    slen2= sizeof(si_other);
    if ((_recvSocket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    {
        printf("failed to create socket: %d", WSAGetLastError());
    }

    _recvSocket = (AF_INET, SOCK_DGRAM, 0);
    memset((char *)&server, 0, sizeof(server));

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(PORT);

    if (bind(_recvSocket, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d",
            WSAGetLastError());
    /*  system("PAUSE");
            exit(EXIT_FAILURE);*/

    }
}

void UDPNetwork::initclient(){

    slen = sizeof(si_other);
    _sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (_sendSocket == SOCKET_ERROR)
    {
        printf("failed to create socket... ");
        exit(EXIT_FAILURE);
    }

    memset((char *)&si_other, 0, sizeof(si_other));
    si_other.sin_family = AF_INET;
    si_other.sin_port = htons(PORT);
    si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);

}

void UDPNetwork::send(float x, float y,  float z)
{
    sprintf(bufOut,"%f,%f,%f", x, y, z);
    if (sendto(_sendSocket, bufOut, strlen(bufOut), 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
    {
        printf("sento() failed with error code : d%", WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    //printf("Sent: %s\n", bufOut);

}

void UDPNetwork::recv(char *msg)
{
    float ax = 0; float ay = 0; float az = 0;
    memset(msg, '[=10=]', BUFLEN);
    recv_len = recvfrom(_recvSocket, msg, BUFLEN, 0, (struct sockaddr*) &si_other, &slen);


    int nError = WSAGetLastError();
    if (nError != WSAEWOULDBLOCK&&nError != 0);
    { 
            printf("Recv failed with error code : %d",
        WSAGetLastError());
        //system("PAUSE");
        //exit(EXIT_FAILURE);
    }
    recv = buf;
    sscanf_s(msg, "'%f,%f,%f", &ax,&ay,&az);
    printf("RECV: %f %f %f\n", ax, ay, az);

}

在深入搜索 MSDN 档案后,我发现了这个有用的小页面 https://msdn.microsoft.com/en-us/library/bb530747%28v=vs.85%29.aspx 希望这会增加对我的问题的一些了解。我会更新天气信息,这个资源最终解决了我的问题

大多数 UDP 接收器会将数据发送回发送接收数据的同一 IP:Port。因此,通过创建两个不同的套接字,您正在使用两个不同的 IP:Port 对,这可能是您没有接收数据的原因。数据很可能被发送到与您正在阅读的那个不同的IP:Port。

对于 UDP,通常不需要创建单独的发送和接收套接字。您可以创建一个 UDP 套接字并将其用于发送和接收,因此发送 IP:Port 与接收 IP:Port 匹配。唯一需要创建单独套接字的情况是接收方有意将其数据发送到与发送套接字所使用的不同的IP:Port。