您的位置:首页 > 理论基础 > 计算机网络

VC:简单聊天室程序1 --- 多线程编写网络聊天室程序

2012-02-02 10:17 459 查看
简单聊天室程序1 --- 多线程编写网络聊天室程序

#define WM_RECVDATA WM_USER+1

ON_MESSAGE(WM_RECVDATA,OnRecvData)

struct RECVPARAM

{

SOCKET sock;

HWND hwnd;

};

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(6000);

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;

}

BOOL CChatDlg::OnInitDialog()

{

// TODO: Add extra initialization here

InitSocket();

RECVPARAM *pRecvParam=new RECVPARAM;

pRecvParam->sock=m_socket;

pRecvParam->hwnd=m_hWnd;

//创建接收现成 RecvProc

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

CloseHandle(hThread);

return TRUE; // return TRUE unless you set the focus to a control

}

DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)

{

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

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

delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxin

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 CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)

{

CString str=(char*)lParam;

CString strTemp;

GetDlgItemText(IDC_EDIT_RECV,strTemp);

str+="\r\n";

str+=strTemp;

SetDlgItemText(IDC_EDIT_RECV,str);

}

void CChatDlg::OnBtnSend()

{

// 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,"");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: