首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDP recvfrom不工作

UDP recvfrom不工作
EN

Stack Overflow用户
提问于 2015-10-01 14:09:16
回答 1查看 2.2K关注 0票数 2

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

代码语言:javascript
复制
//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无法从成功传递的port.The UDPIPV4Server.config()函数中读取数据。但是UDPIPV4Server.RecvData()没有返回。UDP recvfrom正在等待,因此没有接收到数据。代码有什么问题吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-12-14 05:50:47

我也有同样的问题。在UDP中,当wireshark确认有效的UDP数据包到达正确的端口时,recvfrom的行为就好像没有可用的数据一样。它发生在我的compagny的电脑上,但它在我的个人电脑上工作得很好。我猜这是链接到windows防火墙或antivir,如果你的软件不允许相关的端口,它会过滤传入的数据包。我注意到recvfrom只工作过一次,就在通过同一端口发送数据包之后。可能这是链接到我的计算机的配置。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32880511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档