c++不能接收udp报文(Socket)

C++ cant receive UDP-Packets (Socket)

本文关键字:Socket 报文 udp 不能 c++      更新时间:2023-10-16

我正在研究一个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: %dn", 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: %dn", 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: %dn",WSAGetLastError());
        printf("Error: send, error code: %dn", 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: %dn",WSAGetLastError());
            printf("Fehler: recv, fehler code: %dn", WSAGetLastError());
            //return 1;
        }
        else
        {
            wait = 1;
            printf("%d bytes received!n", receive);
            buffer[receive] = '';
            printf("Received: %sn", buffer);
        }
    }
}
getchar();
return 0;
}

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

要使您的代码几乎按原样发送给自己,请执行以下操作:

  • 更改"me"端口以匹配"other"…si_me.sin_port = htons( 2000 );
  • 绑定到它…bind( sock, (SOCKADDR*)&si_me, sizeof( SOCKADDR ) );connect之前

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

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