简体   繁体   English

C ++-Windows-recvfrom()失败,在简单服务器上显示“无此文件或目录”

[英]C++ - Windows - recvfrom() failing with “No such file or directory” on simple server

Here is the code of the very simple server I'm trying to make: 这是我要制作的非常简单的服务器的代码:

Network.h: Network.h:

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <system_error>
#include <string>
#include <iostream>

#pragma once

class WSASession
{
public:
    WSASession()
    {
        int ret = WSAStartup(MAKEWORD(2, 2), &data);
        if (ret != 0)
            throw std::system_error(WSAGetLastError(), std::system_category(), "WSAStartup Failed");
    }
    ~WSASession()
    {
        WSACleanup();
    }
private:
    WSAData data;
};

class UDPSocket
{
public:
    UDPSocket()
    {
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (sock == INVALID_SOCKET)
            throw std::system_error(WSAGetLastError(), std::system_category(), "Error opening socket");
    }
    ~UDPSocket()
    {
        closesocket(sock);
    }

    void SendTo(const std::string& address, unsigned short port, const char* buffer, int len, int flags = 0)
    {
        sockaddr_in add;
        add.sin_family = AF_INET;
        add.sin_addr.s_addr = inet_addr(address.c_str());
        add.sin_port = htons(port);
        int ret = sendto(sock, buffer, len, flags, reinterpret_cast<SOCKADDR *>(&add), sizeof(add));
        if (ret < 0)
            throw std::system_error(WSAGetLastError(), std::system_category(), "sendto failed");
    }
    void SendTo(sockaddr_in& address, const char* buffer, int len, int flags = 0)
    {
        int ret = sendto(sock, buffer, len, flags, reinterpret_cast<SOCKADDR *>(&address), sizeof(address));
        if (ret < 0)
            throw std::system_error(WSAGetLastError(), std::system_category(), "sendto failed");
    }
    sockaddr_in RecvFrom(char* buffer, int len, int flags = 0)
    {
        sockaddr_in from;
        int size = sizeof(from);
        int ret = recvfrom(sock, buffer, len, flags, reinterpret_cast<SOCKADDR *>(&from), &size);
        if (ret < 0)
            throw std::system_error(WSAGetLastError(), std::system_category(), "recvfrom failed");

        // make the buffer zero terminated
        buffer[ret] = 0;
        return from;
    }
    void Bind(unsigned short port)
    {
        sockaddr_in add;
        add.sin_family = AF_INET;
        add.sin_addr.s_addr = htonl(INADDR_ANY);
        add.sin_port = htons(port);

        int ret = bind(sock, reinterpret_cast<SOCKADDR *>(&add), sizeof(add));
        if (ret < 0)
            throw std::system_error(WSAGetLastError(), std::system_category(), "Bind failed");
    }

private:
    SOCKET sock;
};

Listener server: 侦听器服务器:

   try
    {
        WSASession Session;
        UDPSocket Socket;
        char buffer[512];

        Socket.Bind(22);
        while (1)
        {
            sockaddr_in add = Socket.RecvFrom(buffer, sizeof(buffer));

            std::string srecv(buffer);
        }
    }
    catch (std::system_error& e)
    {
        std::cout << e.what();
    }

All is perfect until it accepts a connection from a client. 在接受来自客户端的连接之前,一切都是完美的。 The recvfrom function fails with error "No such file or directory" recvfrom函数失败,错误为“无此文件或目录”

Does anyone see the problem? 有人看到这个问题吗? I know the port isn't problematic because I was listening on the same port from a .net application which works perfectly. 我知道端口没有问题,因为我正在从.net应用程序监听同一端口,该端口运行良好。

You have: 你有:

const std::string& address, unsigned short port, const char* buffer, int len, int flags = 0)

and

    int ret = sendto(sock, buffer, len, flags, reinterpret_cast<SOCKADDR *>(&add)

The cast is invalid. 强制转换无效。 A std::string isn't a SOCKADDR . std::string不是SOCKADDR You have to convert, probably by calling getaddrinfo() . 您必须通过调用getaddrinfo()进行转换

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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