16,472
社区成员
发帖
与我相关
我的任务
分享
void CTCPServerDlg::OnSend()
{
DWORD dwThreadId = 2;
m_hSendThread = ::CreateThread(NULL, NULL, CTCPServerDlg::SendProc, ((LPVOID)this), 0, &dwThreadId);
CloseHandle(m_hSendThread);
}
DWORD WINAPI CTCPServerDlg::SendProc(LPVOID lpPar)
{
SOCKET *pClientSocket = (SOCKET*)lpPar;
CTCPServerDlg *pThis = (CTCPServerDlg*)lpPar;
//dlg=(CTCPServerDlg*)pParam;
char buff[200];
char * ct;
CTime time = CTime::GetCurrentTime(); //获取当前时间
CString t = time.Format(" %H:%M:%S"); //设置时间显示格式
ct=(char*)t.GetBuffer(0); //cstring 转 char*
pThis->c_sendbuf.GetWindowText(buff,200);
pThis->c_sendbuf.SetWindowText(NULL);
CString Ser="服务器: >";
strcat(buff,ct);
send(*pClientSocket,buff,strlen(buff)+1,0);
pThis->c_recvbuf.AddString(Ser+buff);
return 0;
}
HANDLE hThread=CreateThread(NULL,0,WaitProc,(LPVOID)pRecvParam,0,NULL);
::CreateThread(NULL, NULL, CChatDlg::RecvProc, (LPVOID)sockConn, 0, &dwThreadId);
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
SOCKET *sockConn = (SOCKET*)lpParameter;
CChatDlg *pThis = (CChatDlg*)lpParameter;
//你并没有传递指针,可以随便用吗,如果传两个东西的话建议和上面等待线程一样弄个结构体
void CChatDlg::OnCreate() //单击启动服务按钮
{
m_socket=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox("套接字创建失败!");
//return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_addr.S_un.S_addr=inet_addr(m_ip);
addrSock.sin_port=htons(atoi(m_port));
int retval;
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox("绑定失败!");
// return FALSE;
}
listen(m_socket,5);
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->sock=m_socket;
pRecvParam->hwnd=m_hWnd;
HANDLE hThread=CreateThread(NULL,0,WaitProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
}
DWORD WINAPI CChatDlg::WaitProc(LPVOID lpParameter) //接受连接线程
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR);
CString strNotice; /* 通知消息 */
while(1)
{
Sleep(10);
/* 创建通信套接字 */
SOCKET *sockConn = new SOCKET;
*sockConn = ::accept(sock, (SOCKADDR*)&addrFrom, &len);
if(INVALID_SOCKET == *sockConn)
{
strNotice = "accept()失败,再次尝试 ...... ";
::AfxMessageBox(strNotice);
continue;
}
else
AfxMessageBox("一个客户端已成功连接");
DWORD dwThreadId = 1;
/* 启动相应线程与客户端通信 */
::CreateThread(NULL, NULL, CChatDlg::RecvProc, (LPVOID)sockConn, 0, &dwThreadId);
}
return 0;
}
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
SOCKET *sockConn = (SOCKET*)lpParameter;
CChatDlg *pThis = (CChatDlg*)lpParameter;
// HWND hwnd=((RECVPARAM*)lpPar)->hwnd;
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];
while(TRUE)
{
Sleep(10);
int nRecv = ::recv(*sockConn, recvBuf, 200, 0); //接收数据
if(nRecv > 0) {
recvBuf[nRecv] = '\0'; //在接收的数据末尾处加\0
AfxMessageBox(recvBuf); //测试是否已接收到消息
}
if(SOCKET_ERROR==nRecv)
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;
c_recvbuf.AddString(strTemp);
}
public:
DWORD SendProcFun();
DWORD CTCPServerDlg::SendProcFun()
{
//这个中的操作和普通的函数类似
}
DWORD WINAPI CTCPServerDlg::SendProc(LPVOID lpPar)
{
CTCPServerDlg *pThis = (CTCPServerDlg*)lpPar;
__try
{
return pThis->SendProcFun();
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
ASSERT(0);
}
return 1;
}