学习VC++深入浅出——网络通讯编程
来源:互联网 发布:c语言的发展前景 编辑:程序博客网 时间:2024/05/17 01:31
学习VC++深入浅出——网络通讯编程
private:
SOCKET m_socket;
#define WM_RECVDATA WM_USER+1
struct RECVPARAM
...{
SOCKET sock;
HWND hwnd;
};
if(!AfxSocketInit())
...{
AfxMessageBox("加载套接字库失败!");
return false;
}
BOOL CThreadChatDlg::OnInitDialog()
...{
InitSocket();
RECVPARAM *pRecvParam = new RECVPARAM;
pRecvParam->sock = m_socket;
pRecvParam->hwnd = m_hWnd;
HANDLE hThread = CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
}
BOOL CThreadChatDlg::InitSocket()
...{
m_socket =socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == m_socket)
...{
MessageBox("套接字创建失败!");
return false;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000);
int retval;
retval =bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR == retval)
...{
closesocket(m_socket);
MessageBox("绑定失败!");
return false;
}
return true;
}
DWORD WINAPI CThreadChatDlg::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];
char tempBuf[300];
int retval;
while(true)
...{
retval =recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR == retval)
break;
sprintf(tempBuf,"%s 说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}
void CThreadChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
...{
CString str =(char*)lParam;
CString strTemp;
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str+=" ";
str +=strTemp;
SetDlgItemText(IDC_EDIT_RECV,str);
}
void CThreadChatDlg::OnButtonSend()
...{
// TODO: Add your control notification handler code here
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKADDR_IN addrTo;
addrTo.sin_family = AF_INET;
addrTo.sin_port = htons(6000);
addrTo.sin_addr.S_un.S_addr = htonl(dwIP);
CString strSend;
GetDlgItemText(IDC_EDIT_SEND,strSend);
sendto(m_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
SetDlgItemText(IDC_EDIT_SEND,"");
}
SOCKET m_socket;
#define WM_RECVDATA WM_USER+1
struct RECVPARAM
...{
SOCKET sock;
HWND hwnd;
};
if(!AfxSocketInit())
...{
AfxMessageBox("加载套接字库失败!");
return false;
}
BOOL CThreadChatDlg::OnInitDialog()
...{
InitSocket();
RECVPARAM *pRecvParam = new RECVPARAM;
pRecvParam->sock = m_socket;
pRecvParam->hwnd = m_hWnd;
HANDLE hThread = CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
}
BOOL CThreadChatDlg::InitSocket()
...{
m_socket =socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == m_socket)
...{
MessageBox("套接字创建失败!");
return false;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000);
int retval;
retval =bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR == retval)
...{
closesocket(m_socket);
MessageBox("绑定失败!");
return false;
}
return true;
}
DWORD WINAPI CThreadChatDlg::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];
char tempBuf[300];
int retval;
while(true)
...{
retval =recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR == retval)
break;
sprintf(tempBuf,"%s 说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}
void CThreadChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
...{
CString str =(char*)lParam;
CString strTemp;
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str+=" ";
str +=strTemp;
SetDlgItemText(IDC_EDIT_RECV,str);
}
void CThreadChatDlg::OnButtonSend()
...{
// TODO: Add your control notification handler code here
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKADDR_IN addrTo;
addrTo.sin_family = AF_INET;
addrTo.sin_port = htons(6000);
addrTo.sin_addr.S_un.S_addr = htonl(dwIP);
CString strSend;
GetDlgItemText(IDC_EDIT_SEND,strSend);
sendto(m_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
SetDlgItemText(IDC_EDIT_SEND,"");
}
- 学习VC++深入浅出——网络通讯编程
- 学习VC++深入浅出——组件编程
- 学习VC++深入浅出——ODBC编程
- 学习VC++深入浅出——ODBC编程
- 《VC网络通讯编程实例》目录
- 学习VC++深入浅出——绘图操作
- 学习VC++深入浅出——状态栏的设置
- 学习VC++深入浅出——匿名管道的使用
- 学习VC++深入浅出——命名管道的使用
- 学习VC++深入浅出——剪贴板的使用
- 学习VC++深入浅出——钩子的使用
- 学习VC++深入浅出——DLL的使用
- 学习VC++深入浅出——常用对话框的操作
- 学习VC++深入浅出——ADO的使用
- 学习VC++深入浅出——ADO的使用
- 黑马程序员————Java网络通讯编程详解
- ACE中网络通讯编程基本架构——20110518
- 黑马程序员——网络编程1:网络通讯原理简介
- DataReader绑定查询出来的一条记录。速度查询快
- [4.1.x]Tapestry4.1.x中内置的ajax(不用写任何的javascript)
- Mac osX下的Xcode编程
- unicode
- 凝聚力就是竞争力
- 学习VC++深入浅出——网络通讯编程
- 如何使一个批处理软件开机自动运行
- 再读C++ Primer 写了个小例子——网络编程
- 解析extern
- Tapestry4常用的注入对象
- 网友聚会解答
- window.open()参数列表
- 闲谈 Web 图片服务器
- C++学习笔记(17)——虚函数与构造函数、析构函数