Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UDP recvfrom不工作_C++_Windows_Sockets_Udp - Fatal编程技术网

C++ UDP recvfrom不工作

C++ UDP recvfrom不工作,c++,windows,sockets,udp,C++,Windows,Sockets,Udp,我有一个UDP服务器程序,它从7888端口接收数据。服务器代码如下 //UDPIPV4Server.h #pragma once #include <iostream> #include <string> #include <winsock2.h> #include <windows.h> #include <Ws2tcpip.h> using std::string; using std::cout; using std::end

我有一个UDP服务器程序,它从7888端口接收数据。服务器代码如下

//UDPIPV4Server.h
#pragma once

#include <iostream>
#include <string>
#include <winsock2.h>
#include <windows.h>
#include <Ws2tcpip.h>

using std::string;
using std::cout;
using std::endl;
using std::cerr;

class UDPIPV4Server
{
public:
    UDPIPV4Server();
    ~UDPIPV4Server(void);
    UINT type;
    string mac_address;
    UINT port;
    int socket_var;
    struct sockaddr_in si_server, si_client;


    int Config(void);
    int RecvData(char* recv_buffer, int buf_size,string *ip_addr);
};

//UDPIPV4Server.cpp
int UDPIPV4Server::Config(void) {
    WSADATA wsadata;
    int error = WSAStartup(0X0202, &wsadata);

    if(error) {
        cerr<<"UdpIPV4Server.cpp:- WSAStartup failed"<<endl;
        return -1;
    }
    if ((socket_var = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
        cerr<<"UdpIPV4Server.cpp:- socket function failed"<<endl;
        return -1;
    }
    memset((char *) &si_server, 0, sizeof(si_server));
    si_server.sin_family = AF_INET;
    si_server.sin_port = htons(7888);
    char host[NI_MAXHOST] = "10.8.0.2";
    if(inet_pton(AF_INET, host, &si_server.sin_addr) != 1) {
        cerr<<"UdpIPV4Server.cpp: inet_pton() failed\n";
        return -1;
    }
    if(bind(socket_var,(struct sockaddr *)&si_server,sizeof(si_server)) == -1) {
            cerr<<"UdpIPV4Server.cpp:- bind failed: "<<endl;
            return -1;
    }
    return 0;
}

//recv data from the UDP client
//recv_buffer - [out] receive buffer
//buf_size - [in] size of receive buffer in bytes
//ip_addr - [out] ip address of the remote client
int UDPIPV4Server::RecvData(char* recv_buffer, int buf_size, string *ip_addr) {
    int recv_len;
    cout<<"waiting for data\n";
    memset((char*)&si_client, 0, sizeof(struct sockaddr_in));
    int si_client_len = sizeof(si_client);
    if((recv_len = recvfrom(socket_var, recv_buffer, buf_size, 0, (struct sockaddr *)&si_client, &si_client_len)) == -1) {
        cerr<<"udpipv4server.cpp:- recvfrom failed"<<endl;
        return recv_len;
    }
    char client_addr[INET_ADDRSTRLEN];
    cout<<"Received packets from "<<inet_ntoa(si_client.sin_addr)<<":"<<ntohs(si_client.sin_port)<<endl;
    *ip_addr = inet_ntoa(si_client.sin_addr);
    return recv_len;
}
//main.cpp
#include "UDPIPV4Server.h"
int main() {
UDPIPV4Server udp_server;
udp_server.Config();
char recv_frame_buffer[65534] = "";
memset(recv_frame_buffer,0,sizeof(recv_frame_buffer));
int retval;
string ip_addr;
if((retval = udp_server.RecvData(recv_frame_buffer,sizeof(recv_frame_buffer),&ip_addr)) ==  -1) {
    cerr<<"ReceiverCommModule:- Error in receving data"<<endl;
    continue;
}
}
//UDPIPV4Server.h
#布拉格语一次
#包括
#包括
#包括
#包括
#包括
使用std::string;
使用std::cout;
使用std::endl;
使用std::cerr;
类UDPIPV4Server
{
公众:
UDPIPV4Server();
~UDPIPV4Server(void);
UINT型;
字符串mac_地址;
UINT端口;
int-socket_-var;
si_服务器、si_客户端中的结构sockaddr_;
int配置(无效);
int RecvData(char*recv_buffer,int buf_size,string*ip_addr);
};
//UDPIPV4Server.cpp
int UDPIPV4Server::Config(void){
WSADATA WSADATA;
int error=WSAStartup(0X0202,&wsadata);
如果(错误){

cerr我也有同样的问题。在UDP中,recvfrom的行为就像没有可用的数据一样,因为wireshark确认了一个有效的UDP数据包到达了正确的端口。它发生在我公司的计算机上,但在我个人的计算机上工作正常。我猜这与windows防火墙或抗病毒病毒有关,如果关联的端口为您的软件不允许使用。我注意到recvfrom只在通过同一端口发送数据包后工作一次。这可能与我的计算机的配置有关。

如果您正在编写特定于操作系统的代码,最好包含相关标记(Windows)。如果UDPIPV4Server是第三方库的一部分,您应该命名它并提供链接;如果它是您的全部代码,您应该提取/包含足够的库,以创建再现问题的最小示例程序。“但是套接字无法从端口读取数据。”-这太模糊了:是
recvfrom
没有返回,还是返回到打印“recvfrom failed”的状态?“套接字无法读取数据”不是问题描述。请重试。注意不要打印
“bind failed”、“recvfrom failed”、“
等。打印实际错误,如
errno、
或使用
strerror()
perror()。
所有系统调用都相同,而不仅仅是
bind().
否则调试只是一个猜测游戏。@TonyD我已经编辑了代码。问题是
UDP recvfrom
等待,好像没有收到任何数据。但是在wireshark中,我可以清楚地看到收到的数据。我没有注意到任何明显的错误。你可以从
inet\u pton
更改为
。sin\u addr.s\u addr=htonl(INADDR\u any)
临时-这意味着它将监视所有接口-查看是否相关。确保防火墙允许该端口上的数据包-wireshark通常在防火墙之前进行监视。