【问题标题】:C++ cant receive UDP-Packets (Socket)C++ 无法接收 UDP 数据包(套接字)
【发布时间】:2015-11-26 14:43:29
【问题描述】:

我正在开发一个 C++ UDP 程序,该程序向另一个客户端发送一个字符串并应该收到一个答案。

发送工作正常,但我无法接收任何数据包。我用wireshark查看,我的计算机在正确的端口和正确的IP接收数据包,但我的程序似乎忽略了它们。

你有什么想法吗?

int startWinsock(void);
int main()
{
long receive;
SOCKET sock;
char buffer[256];
SOCKADDR_IN si_me;
SOCKADDR_IN si_other;

///////////// Start Winsock ///////////////
receive = startWinsock();
if (receive != 0)
{
    printf("Error: startWinsock, error code: %d\n", receive);
    return 1;
}
else
{
    printf("Winsock started!\n");
}

//////////// Create UDP Socket //////////////
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
    printf("Fehler: Socket could not be created, errorcode: %d\n", WSAGetLastError());
    return 1;
}
else
{
    printf("UDP Socket created!\n");
}

si_me.sin_family = AF_INET;
si_me.sin_port = htons(1198);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);

si_other.sin_family = AF_INET;
si_other.sin_port = htons(2000);
si_other.sin_addr.s_addr = inet_addr("10.2.134.10");

receive = connect(sock, (SOCKADDR*)&si_other, sizeof(SOCKADDR));

if (receive == SOCKET_ERROR)
{
    cout << "Error : Connection Failed, Errorcode: " << WSAGetLastError() << endl;
}
else
{
    cout << "Connected to" << si_other.sin_addr.s_addr << endl;
}
static int timeout = 500;

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
//  char broadcast = 1;
//  setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));

while (1)
{
    printf("Insert Text: ");
    gets(buffer);
    //rc = sendto(s, buf, strlen(buf), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
    receive = send(sock, buffer, strlen(buffer), 0);
    if (receive == SOCKET_ERROR)
    {
        //printf("error: sendto, error code: %d\n",WSAGetLastError());
        printf("Error: send, error code: %d\n", WSAGetLastError());
        //return 1;
    }
    else
    {
        printf("%d bytes sent!\n", receive);
    }
    static int timeout = 500;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
    int wait = 0;
    while (wait == 0)
    {
        //rc = recvfrom(s, buf, 256, 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
        receive = recv(sock, buffer, sizeof(buffer), 0);
        if (receive == SOCKET_ERROR)
        {
            //printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError());
            printf("Fehler: recv, fehler code: %d\n", WSAGetLastError());
            //return 1;
        }
        else
        {
            wait = 1;
            printf("%d bytes received!\n", receive);
            buffer[receive] = '\0';
            printf("Received: %s\n", buffer);
        }
    }
}

getchar();
return 0;
}


int startWinsock(void)
{
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2, 0), &wsa);
}

【问题讨论】:

  • 你得到什么错误?

标签: c++ sockets networking udp winsock


【解决方案1】:

由于 UDP 是面向数据报且无连接的,因此您需要使用 recvfrom/sento 而不是 recv/send。此外,receivetimeout 应设置为 timeval。

struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));

【讨论】:

  • 因为他使用的是connect(),所以他不需要使用sendto()/recvfrom()
【解决方案2】:

要使您的代码通过发送到自身几乎可以正常工作,请执行以下操作:

  • 更改“我”端口以匹配“其他”...si_me.sin_port = htons( 2000 );
  • 绑定到它...bind( sock, (SOCKADDR*)&amp;si_me, sizeof( SOCKADDR ) );就在connect之前

【讨论】:

  • 为什么要相互匹配?
  • 你是对的......我只是设置它,以便它可以发送和接收到自己,这在他的示例代码中只需要这些更改。假设有另一个进程,“我”和“其他”地址需要彼此相反(或者至少有一个客户端/服务器,服务器总是回复客户端的源地址/端口)。我会编辑它...
猜你喜欢
  • 2017-09-04
  • 2010-11-13
  • 2013-11-08
  • 1970-01-01
  • 2011-08-11
  • 2015-11-28
  • 2013-03-23
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多