FPGA和PC端MFC程序进行UDP通讯

FPGA和PC端MFC程序进行UDP通讯,第1张

分包与重组的过程是肯定要有的,但问题是 UDP 的传输方式不保证可靠性,但是文件传输必须要可靠,这一点你想怎么解决,我的看法是你需要在你的协议中解决这启碰个问题祥氏,为了增强谨旁散可靠性就需要在你的程序中实现接让收方发送回执。你要考虑的是如果丢包双方该如何响应?Windows 消息机制只能满足处理时的可靠性,不能保证传输过程的可靠性。

在应用程序类重载的InitInstance函数中调用AfxSocketInit()函数,加载套接字。

1

2

3

4

5

if(!AfxSocketInit())

{

AfxMessageBox("加载套接字库失败!")

return FALSE

}

1

在你的对话框类中添加如下函数InitSocket(),初始哗衫帆化套接字

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

BOOL CChatDlg::InitSocket()

{

m_socket=socket(AF_INET,SOCK_DGRAM,0)

if(INVALID_SOCKET==m_socket)

{

MessageBox("套接字创建失败!")

return FALSE

}

SOCKADDR_IN addrSock

addrSock.sin_family=AF_INET

addrSock.sin_port=htons(5000)

addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY)

int retval

retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR))

if(SOCKET_ERROR==retval)

{

closesocket(m_socket)

MessageBox("绑定失败!")

return FALSE

}

return TRUE

}

1

在对话框类的OnInitDialog()函数中调用上述InitSocket()函数,初始化套接字,同时创建一个线程接收数据:

1

2

3

4

5

RECVPARAM *pRecvParam=new RECVPARAM

pRecvParam->sock=m_socket

pRecvParam->塌猜hwnd=m_hWnd

HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL)

CloseHandle(hThread)

1

2

3

4

5

其中struct RECVPARAM

{

SOCKET sock

HWND hwnd

}是自定义结构体

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

接收线程函数RecvProc:

DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)

{

SOCKET sock=((RECVPARAM*)lpParameter)->sock

HWND hwnd=((RECVPARAM*)lpParameter)->hwnd

delete lpParameter

SOCKADDR_IN addrFrom

int len=sizeof(SOCKADDR)

char recvBuf[200]

int retval

while(TRUE)

{

retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len)

if(SOCKET_ERROR==retval)

break

}

return 0

}

1

recvBuf中就保存了你要的数乱雹据。

没用过OPC,不过如果是界面卡死,你可以用SPY++看看窗口消息,再打断点进入处理函数瞧瞧,看主线程卡在了哪里。

另外,你多个线程发送多个消息给主线宏告程,也不知道你主线程接收消息的代码如何处理的蔽察明。

有没穗没有使用线程互斥。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12523395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存