繁体   English   中英

使用 UDP 套接字发送和接收实时数据

[英]Send and Receive Live data using UDP Socket

我正在练习套接字编程。 这是我的服务器代码。

服务器.cpp

/* UDP Server Sample program*/
#include <Windows.h>
#include <iostream>
#include <winsock.h>
using namespace std;
int main()
{
    // Local Variable definitions

    cout << "\t\t------- UDP Server---" << endl;
    cout << endl;

    WSADATA   WinSockData;
    int       iWsaStartup;
    int       iWsaCleanup;

    SOCKET    UDPSocketServer;
    struct    sockaddr_in UDPClient;

    char      Buffer[512];
    int       iBufferLen = strlen(Buffer) + 1;

    int       iBind;
    int       iReceiveFrom;

    int       iUDPClientLen = sizeof(UDPClient);
    int       iCloseSocket;

    // STEP-1 Initialization of Winsock
    iWsaStartup = WSAStartup(MAKEWORD(2, 2), &WinSockData);

    if (iWsaStartup != 0)
    {
        cout << "WSAStartUp Fun Failed" << endl;
    }
    cout << "WSAStartUp Success" << endl;

    //STEP-2 Fill the UDPClient(SOCKET ADDRESS) Structure
    UDPClient.sin_family = AF_INET;
    UDPClient.sin_addr.s_addr = inet_addr("169.254.131.8");
    UDPClient.sin_port = htons(8001);

    // STEP-3 Socket Creation
    UDPSocketServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (UDPSocketServer == INVALID_SOCKET)
    {
        cout << "Socket Creation Failed " << endl;
        cout << "Error No-> " << WSAGetLastError() << endl;
    }
    cout << "Socket Creation Success" << endl;
    // STEP-4 bind the server
    iBind = bind(
        UDPSocketServer,
        (SOCKADDR*)&UDPClient,
        sizeof(UDPClient));
    if (iBind == SOCKET_ERROR)
    {
        cout << "Binding Failed " << endl;
        cout << "Error No-> " << WSAGetLastError() << endl;
    }
    cout << "Binding Success" << endl;
    //STEP-5 RecvFrom Fun from receive data from client
    while (1)
    {
        iReceiveFrom = recvfrom(
            UDPSocketServer,
            Buffer,
            iBufferLen,
            MSG_PEEK,
            (SOCKADDR*)&UDPClient,
            &iUDPClientLen);

        if (iReceiveFrom == SOCKET_ERROR)
        {
            cout << "Receiving failed " << endl;
            cout << "Error No-> " << WSAGetLastError() << endl;
        }
        cout << "Receiving Success" << endl;
        cout << "Receive Data -> " << Buffer << endl;
    }

    //STEP-6 CloseSocket Function
    iCloseSocket = closesocket(UDPSocketServer);

    if (iCloseSocket == SOCKET_ERROR)
    {
        cout << "Socket Closing failed " << endl;
        cout << "Error No-> " << WSAGetLastError() << endl;
    }
    cout << "Socket CLosing Success" << endl;

    //STEP-7 WSACLeanUp Fun for Terminating the use of DLL
    iWsaCleanup = WSACleanup();
    if (iWsaCleanup == SOCKET_ERROR)
    {
        cout << "WSA CleanUp failed " << endl;
        cout << "Error No-> " << WSAGetLastError() << endl;
    }
    cout << "WSA CleanUp Success" << endl;

    system("PAUSE");
    return 0;
}

这是客户端代码...

客户端.cpp



/*All right reserved to awinsyspro.com 2019*/
/* UDP Server Sample program*/

#include <Windows.h>
#include <winsock.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
    cout << "\t\t------UDP Client------" << endl;
    cout << endl;
    // Local Variable
    WSADATA   WinSockData;
    int       iWsaStartup;
    int       iWsaCleanup;

    SOCKET               UDPSocketClient;
    struct  sockaddr_in  UDPServer;


    // STEP-1 Initialization of Winsock

    iWsaStartup = WSAStartup(MAKEWORD(2, 2), &WinSockData);
    if (iWsaStartup != 0)
    {
        cout << "WSAStartup Failed = " << iWsaStartup << endl;
    }
    cout << "WSAStartup Success" << endl;

    // STEP-2 Fill the UDPServer Structure
    UDPServer.sin_family = AF_INET;
    UDPServer.sin_addr.s_addr = inet_addr("169.254.131.8");
    UDPServer.sin_port = htons(8001);

    // STEP-3 Socket Creation

    UDPSocketClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (UDPSocketClient == INVALID_SOCKET)
    {
        cout << "Socket Creation Failed " << endl;

        cout << "Error No-> " << WSAGetLastError() << endl;
    }

    cout << "UDP Socket Creation Success" << endl;

    int integ = 2656;
    //char Buffer[512] = strint;
    int  iCloseSocket;
    while (1)
    {
        //STEP-4 Sendto Fun.
        string strint = to_string(integ);
        const char* Buffer = strint.c_str();
        int iSendto;

        int  iBufferLen = strlen(Buffer) + 1;
        int  iUDPServerLen = sizeof(UDPServer);

        cout << integ << endl;
        iSendto = sendto(
            UDPSocketClient,
            Buffer,
            iBufferLen,
            MSG_DONTROUTE,
            (SOCKADDR*)&UDPServer,
            sizeof(UDPServer));

        if (iSendto == SOCKET_ERROR)
        {
            cout << "Sending Data Failed " << endl;
            cout << "Error No->" << WSAGetLastError() << endl;
        }
        cout << "Sending Data Success" << endl;
        integ = integ + 1;

        // STEP-5 CloseSocket Function
    }
    iCloseSocket = closesocket(UDPSocketClient);
    if (iCloseSocket == SOCKET_ERROR)
    {
        cout << "Socket Closing failed " << endl;

        cout << "Error No-> " << WSAGetLastError() << endl;
    }

    cout << "Close Socket Success" << endl;

    // STEP-6 WSACleanUp fun for Terminating the Winsock DLL

    iWsaCleanup = WSACleanup();
    if (iWsaCleanup == SOCKET_ERROR)
    {
        cout << "WSA CleanUp failed " << endl;

        cout << "Error No-> " << WSAGetLastError() << endl;
    }
    cout << "Cleanup Success" << endl;
0
    system("PAUSE");
    return 0;
}

我想在每次循环后以 1 的增量从客户端发送 integer 数据,并在服务器端接收相应的值。 但我只收到常量 integer 值“0”。 我不知道如何完成这个任务。 谢谢

   char      Buffer[512];

这在自动存储中声明了一个char数组。 char数组完全未初始化。 下一条语句:

   int       iBufferLen = strlen(Buffer) + 1;

这将尝试通过搜索其终止\0字节来确定Buffer中字符串的大小。 毕竟,这就是strlen()所做的。 很明显,此处的意图是将iBufferLen设置为 512 或sizeof(Buffer) ,而不是其当前字符串的大小加 1,这显然是不正确的。

由于Buffer未初始化,不包含任何字符串,并且可能包含随机二进制垃圾,从这一点来看,显示的代码是未定义的行为。

如果您还没有学会如何使用调试器,您应该认为这是学习如何使用调试器的绝佳机会。 如果您使用调试器运行程序,一次一行,调试器会立即向您显示iBufferLen可能设置为 1 或 0,而不是 512。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM