在MFC中的UDP程序怎么编写用CAsyncSocket或者CSocket?

在MFC中的UDP程序怎么编写用CAsyncSocket或者CSocket?,第1张

呵呵整一个socket盲

还一上来就要用封装好的mfc类,哀分少啊,帮你说说吧

建立一个新类从casyncsocket

public

派生来,叫

mysock,然后在cxxxdlg的头文件加个变量

mysock

m_socket

然后

cxxxdlg中的initdialog初始化,

m_socket.create(0,sock_dgram)

使用udp恩首先你要考虑到服务器端也是使用udp的协议的,然后就可以调用

m_socket.sendto(buffer,strlen(buffer),3333,"xxx.xxx.xxx.xxx")

3333是服务器等待接收数据的端口,xxx.xxx.xxx.xxx

是服务器的ip,恩域名也可以...如果服务器是tcp的话要用connect连接然后用send方法发送数据,使用完调用close关闭socket,也疴可以不关,类销毁时会自动释放所使用资源,恩至于要等待接收数据,udp需要bind,可以在create的时候就绑定上,而tcp不光要绑定上还要listen监听,tcp有连接来后要用accept接收连接,给它一个新的

casyncsocket,呵呵就说这么点,对了在bool

cxxxapp::initinstance()的初始化函数中添加

if

(!afxsocketinit())

{

afxmessagebox(idp_sockets_init_failed)

return

false

}

还有头文件

#include

<afxsock.h>

//

mfc

socket

extensions

.或者你在创建工程时选择上winsocket,

恩对了csocket是堵塞的套接字,需要同步很强的工作再选择他,一般使用异步的,给分!

在应用程序类重载的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中就保存了你要的数据。

GetDlgItem(IDC_IPADDRESS1))是获取控件ID为IDC_IPADDRESS1的句柄

这个是MFC里的IP控件,调用GetAddress,取得IP地址,然后强转成CIPAddressCtrl*指针类型。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存