还一上来就要用封装好的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*指针类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)