1

i faced a problem with Multi-UDP Socket.

Now I have a PC(192.168.58.200), and 3 MPU(STM32F4)(192.168.85.100~102).

and I Conncected RS232 With MPU.

When MPU got a messasge, it returns just 'X', and print out same thing with RS232, so i can distinguish when PC can not send message and when MPU can get a message but PC can not recieve the message.

below is my code, Especially "UdpClient[c].Write( TempStr, strlen(TempStr));" doesnt work.

when it send mesage, only one MPU can get a message, and keep reciving 30~40 sec, some times changed other MPU.

1:1 is fine, but problem is more 2 Peer. please share your experiences.

    // 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)
{
}
kunbumpark
  • 11
  • 1

0 Answers0