gpt4 book ai didi

c++ - UDP recvfrom 不工作

转载 作者:可可西里 更新时间:2023-11-01 11:49:48 24 4
gpt4 key购买 nike

我有从端口 7888 接收数据的 UDP 服务器程序。服务器代​​码如下。

//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;
}
}

以上程序在10.8.0.2:7888接收数据。但是当接收到数据时,此代码不起作用。我已经用 wireshark 检查过,数据是在 10.8.0.2:7888 接收的。但是socket无法从端口读取数据。UDPIPV4Server.config()函数成功通过。但是 UDPIPV4Server.RecvData() 没有返回。 UDP recvfrom 正在等待,因此没有收到数据。代码有什么问题吗?谢谢。

最佳答案

我遇到了同样的问题。在 UDP 中,recvfrom 的行为就好像没有数据可用,尽管 wireshark 确认有效的 UDP 数据包到达了正确的端口。它发生在我公司的电脑上,但在我个人的电脑上运行良好。我想这与 Windows 防火墙或 antivir 相关联,如果您的软件不允许相关端口,它会过滤传入的数据包。我注意到 recvfrom 工作一次,就在通过同一端口发送数据包之后。可能这与我的计算机配置有关。

关于c++ - UDP recvfrom 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32880511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com