C / C ++套接字UDP客户端数据发送->仅发送一个同位体

时间:2018-07-30 16:03:38

标签: udp udpclient

我遇到了多UDP套接字问题。

现在我有一台PC(192.168.58.200)和3个MPU(STM32F4)(192.168.85.100〜102)。

并且我用MPU连接了RS232。

当MPU收到消息时,它仅返回'X',并使用RS232打印出相同的内容,因此我可以区分PC无法发送消息以及MPU何时可以获得消息但PC无法接收到消息。 / p>

下面是我的代码,特别是“ UdpClient [c] .Write(TempStr,strlen(TempStr));”不起作用。

当发送消息时,只有一个MPU可以接收到一条消息,并保持30到40秒的接收时间,有时会更改其他MPU。

1:1很好,但问题更多是2对等。请分享您的经验。

    // udpclient.cpp

#include <stdio.h>
#include "UDPCLIENT.h"
#include "UDPServer.h"




struct sPeer
{
    char IP[64];
    int Port;
};

#define CUR_MPU     3
#define MAX_MPU     16
sPeer Peer[MAX_MPU];


unsigned long _stdcall ReadThread(void *Param) 
{
    UDPSERVERSOCKET UDPSocket;

    int ID = (int)Param;
    printf("Server ID %d\n", ID);

    UDPSocket.Open(Peer[ID].Port);

    while (1)
    {
        char ReadBuffer[1024];
        char Addr[32];

        UDPSocket.Read(Addr, ReadBuffer, 1024);
        printf("%s>%s\n", Addr, ReadBuffer);
    }

    UDPSocket.Close();

    return 0;
}


int main()
{   
    sprintf(Peer[0].IP, "192.168.58.100"); Peer[0].Port = 7726;
    sprintf(Peer[1].IP, "192.168.58.101"); Peer[1].Port = 7727;
    sprintf(Peer[2].IP, "192.168.58.102"); Peer[2].Port = 7728;

    ///////////////////////쓰레드를 연다./////////////////

    for (int c = 0; c < CUR_MPU; c++)
    {
        DWORD ID;
        HANDLE thread01 = CreateThread( NULL,//보안 속성
                                        0,//스택의 크기
                                        ReadThread,//함수
                                        (void *)c,//인자
                                        0,//생성플러그
                                        &ID);// 아이디
    }


    UDPCLIENTSOCKET UdpClient[CUR_MPU];

    for (int c = 0; c < CUR_MPU; c++)
    {
        UdpClient[c].Open(Peer[c].IP, Peer[c].Port);
    }


    while (1)
    {
        char TempStr[1024];
        printf("보낼 메시지 ---");
        scanf("%s", TempStr);

        for (int c = 0; c < CUR_MPU; c++)
        {
            UdpClient[c].Write( TempStr, strlen(TempStr));


        }
    }



    for (int c = 0; c < CUR_MPU; c++)   
        UdpClient[c].Close();


    return 0;
}

Cleint.cpp

    #include "UDPCLIENT.h"



int UDPCLIENTSOCKET::Open(char *Address , int Port)
{
    unsigned int addr;
    int nRtn = WSAStartup(MAKEWORD(1, 1), &wsaData);
    if (nRtn != 0) {
        perror("WSAStartup 오류\n");
        return -1;
    }
    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0) {
        perror("소켓 오류\n");
        WSACleanup();
        return -2;
    }
    lpHostEnt = gethostbyname(Address);
    if (lpHostEnt == NULL) {
        addr = inet_addr(Address);
        lpHostEnt = gethostbyaddr((char *)&addr, 4, AF_INET);
        if (lpHostEnt == NULL) {
            perror("서버를 찾을 수 없습니다.\n");
            _getch();
            return -3;
        }
    }

    memset(&addrin, 0, sizeof(addrin));
    memcpy(&(addrin.sin_addr),
        lpHostEnt->h_addr_list[0],
        lpHostEnt->h_length);
    addrin.sin_port = htons(Port);
    addrin.sin_family = AF_INET;
    //addrin.sin_addr.s_addr =
    //  *((unsigned long *)lpHostEnt->h_addr);

    return 1;
}


void UDPCLIENTSOCKET::Close()
{
    closesocket(s);
    WSACleanup();
}


int UDPCLIENTSOCKET::Write(char *Address, int Port, char *Buffer, int Size)
{
    unsigned int addr;
    lpHostEnt = gethostbyname(Address);
    if (lpHostEnt == NULL) {
        addr = inet_addr(Address);
        lpHostEnt = gethostbyaddr((char *)&addr, 4, AF_INET);
        if (lpHostEnt == NULL) {
            perror("서버를 찾을 수 없습니다.\n");
            _getch();
            return -3;
        }
    }

    memset(&addrin, 0, sizeof(addrin));
    memcpy(&(addrin.sin_addr),
        lpHostEnt->h_addr_list[0],
        lpHostEnt->h_length);
    addrin.sin_port = htons(Port);
    addrin.sin_family = AF_INET;

    int nRtn = sendto(s, Buffer, Size, 0,
        (LPSOCKADDR)&addrin, sizeof(addrin));


    return nRtn;
}

int UDPCLIENTSOCKET::Write(char *Buffer, int Size)
{
    int nRtn = sendto(s, Buffer, Size, 0,
        (LPSOCKADDR)&addrin, sizeof(addrin));


    return nRtn;
}

Server.cpp

    #include "UDPServer.h"



int UDPSERVERSOCKET::Open(u_short uport)
{
    int nRtn;

    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        perror("WSAStartup Error\n");
        return -1;
    }

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0) {
        perror("socket 오류\n");
        WSACleanup();
        return -2;
    }

    memset(&addrin, 0, sizeof(addrin));
    addrin.sin_port = htons(uport);
    addrin.sin_family = AF_INET;
    addrin.sin_addr.s_addr = htonl(INADDR_ANY);

    nRtn = bind(s, (LPSOCKADDR)&addrin, (int)sizeof(addrin));
    if (nRtn == SOCKET_ERROR) {
        perror("bind 오류\n");
        closesocket(s);
        WSACleanup();
        return -3;
    }


    return 1;
}


int UDPSERVERSOCKET::Read(char *Addr, char *Buffer, int Length)
{

    int fromlen = (int)sizeof(from);
    int nRtn = recvfrom(s,
        Buffer,
        Length -1,
        0,
        (SOCKADDR *)&from,
        &fromlen);
    if (nRtn == SOCKET_ERROR)
    {
        Addr[0] = 0;
        perror("recvform 오류\n");
        closesocket(s);
        WSACleanup();
        return -4;
    }

    strcpy(Addr, inet_ntoa(from.sin_addr));
    Buffer[nRtn] = '\0';
    return 1;
}




int UDPSERVERSOCKET::Close()
{
    closesocket(s);
    WSACleanup();
    printf("WSACleanup 완료\n");

    return 1;
}

void UDPSERVERSOCKET::ShowErrorMessage(int i)
{

}


void UDPSERVERSOCKET::ReturnClientIP(char *Buffer)
{
}

0 个答案:

没有答案