sendto和recvfrom在同一个程序中?

时间:2015-04-04 07:20:40

标签: c++ sockets client server winsock

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

我可以轻松地进行程序发送和一个完全不同的程序recv,但似乎原则不会延续到我想要做的事情。

我应该为recvfrom和sendto使用相同的sockaddr_in结构吗?或者他们可以使用同一个吗?怎么样?没有关系,我已经尝试了两个,也没有工作。我尝试过使用一个端口发送,一个接收,我尝试过一个端口来做两个。没有。我对Winsock相对较新,所以如果我听起来毫无希望或遗漏了一些非常明显的东西,那就很抱歉。在这一点上,我真的需要一些帮助,或者至少在正确的方向上有一点我不在乎我只想看看有多少个端口我想看到带有正确数据的recv printf。

winsock错误 绑定失败10048并且recv失败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, '\0', 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);

}

2 个答案:

答案 0 :(得分:1)

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

对于UDP,您通常不需要创建单独的发送和接收套接字。您可以创建一个UDP套接字并将其用于发送和接收,因此发送IP:端口与接收IP:端口匹配。您应该需要创建单独套接字的唯一时间是接收方有意将其数据发送到不同的IP:端口而不是发送套接字正在使用的端口。

答案 1 :(得分:0)

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