- 博客(2)
- 资源 (4)
- 收藏
- 关注
原创 网络编程与多线程的应用--基于socket udp编写一个简单聊天程序
本例是参考孙鑫vc++教程写的一个聊天程序,用到的基本知识是SOCKET跟多线程。 1.基于socket网络编程 socket编程基本上可以分为2类,面向连接的(TCP模式)和面向无连接的(UDP模式),TCP与UDP最大的区别就是TCP相对来说可靠的,保证所传送的内容达到接收端,而UDP不能确保所传送的内容到达接收端,就跟邮寄信件一样,UDP只负责将东西放在邮箱里面,不保证收件人一定能看到,
2014-12-30 11:00:44
2787
基于VC++的简单聊天程序
基于对话框的聊天程序代码:
1.加载套接字库:
在InitInstance函数中
if (!AfxSocketInit())
{
AfxMessageBox(L"load socket lib error!");
return FALSE;
}
2.初始化套接字
BOOL CChatDlg::InitSocket()
{
m_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == m_socket)
{
MessageBox(L"套接字创建失败!");
return FALSE;
}
//创建套接字
SOCKADDR_IN addrSock;
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000);
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int retval = bind(m_socket, (SOCKADDR*)&addrSock, sizeof(SOCKADDR));
if (SOCKET_ERROR == retval)
{
closesocket(m_socket);
MessageBox(L"绑定失败!");
return FALSE;
}
return TRUE;
}
3.创建线程来接收信息
//线程的创建
RecvParam* pRecvParam = new RecvParam;
pRecvParam->sock = m_socket;
pRecvParam->hwnd = m_hWnd;
pRecvParam->hMutex = m_hMutex;
HANDLE hThread = ::CreateThread(NULL, 0, RecvFunc, (LPVOID)pRecvParam, 0 , 0);
CloseHandle(hThread);
线程接收函数
DWORD WINAPI RecvFunc(LPVOID lpParam)// 线程函数 实现数据接收
{
SOCKET sock = ((RecvParam*)lpParam)->sock;
HWND hwnd = ((RecvParam*)lpParam)->hwnd;
HANDLE hMutex = ((RecvParam*)lpParam)->hMutex;
delete lpParam;
SOCKADDR_IN addrFrom;
int len = sizeof(SOCKADDR);
char recvBuf[200];
char tempBuf[300];
int retval;
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
retval = recvfrom(sock, recvBuf, 200, 0,(SOCKADDR*)&addrFrom, &len);
if (SOCKET_ERROR == retval)
{
break;
}
sprintf_s(tempBuf, ("%s 说: %s"), inet_ntoa(addrFrom.sin_addr), recvBuf);
::PostMessage(hwnd, WM_RECVDATA,(WPARAM)tempBuf, NULL);
ReleaseMutex(hMutex);
}
return 0;
}
4. 消息的发送与接收显示
void CChatDlg::OnBnClickedButtonSend()
{
// TODO: Add your control notification handler code here
//获取对方IP
CIPAddressCtrl* pIPAddress = ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS_SEND));
if (pIPAddress->IsBlank())
{
MessageBox(L"请先输入对方IP地址!");
return;
}
DWORD dwIP;
pIPAddress->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);
i
2014-12-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人