15,471
社区成员
发帖
与我相关
我的任务
分享
DWORD WINAPI CTCPServerDlg::RespondProc(LPVOID lpPar)
{
SOCKET *pClientSocket = (SOCKET*)lpPar;
char buff[4096]; /* 接收数据缓冲区 */
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername(*pClientSocket, (struct sockaddr *)&sa, &len);
while(1)
{
Sleep(10);
int nRecv = ::recv(*pClientSocket, buff, 4096, 0);
if(nRecv > 0)
{
buff[nRecv] = '\0';
}
//对接收的数据进行处理
.......
}
}
DWORD WINAPI CTCPServerDlg::RespondProc(LPVOID lpPar)
{
SOCKET *pClientSocket = (SOCKET*)lpPar;
CTCPServerDlg *pThis = (CTCPServerDlg*)lpPar;
char buff[4096]; /* 接收数据缓冲区 */
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername(*pClientSocket, (struct sockaddr *)&sa, &len);
while(1)
{
Sleep(10);
int nRecv = ::recv(*pClientSocket, buff, 4096, 0);
if(nRecv > 0)
{
buff[nRecv] = '\0'; //在接收的数据末尾处加\0
// AfxMessageBox(buff);
}
//对接收的数据进行处理
CString recvbuf;
recvbuf.Format("%s",buff);
pThis->c_recvbuf.AddString(recvbuf); //这是我添加的,会崩溃
}
}
//定义线程函数
DWORD WINAPI CTcpthDlg::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=recv(sock,recvBuf,200,0);
if(SOCKET_ERROR==retval)
break;
sprintf(tempBuf,"%s说: %s",
inet_ntoa(addrFrom.sin_addr),recvBuf);
//利用PostMessage将消息传递给对话框。
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}
DWORD WINAPI CTCPServerDlg::RespondProc(LPVOID lpPar)
{
SOCKET *pClientSocket = (SOCKET*)lpPar;
// SOCKET *pClientSocket = new SOCKET;
CTCPServerDlg *pThis = (CTCPServerDlg*)lpPar;
HWND hwnd=((RECVPARAM*)lpPar)->hwnd; //这句没有用
char buff[4096]; /* 接收数据缓冲区 */
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername(*pClientSocket, (struct sockaddr *)&sa, &len);
while(1)
{
Sleep(10);
int nRecv = ::recv(*pClientSocket, buff, 4096, 0);
if(nRecv > 0)
{
buff[nRecv] = '\0'; //在接收的数据末尾处加\0
AfxMessageBox(buff);
}
//对接收的数据进行处理
CString recvbuf;
hwnd = AfxGetMainWnd()->m_hWnd;
recvbuf.Format("%s",buff);
//利用PostMessage将消息传递给对话框。
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)buff);
}
}
void CTCPServerDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString str=(char*)lParam;
c_recvbuf.AddString(str);
}
DWORD WINAPI CTCPServerDlg::WaitProc(LPVOID lpPar)
{
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
CTCPServerDlg *pThis = (CTCPServerDlg*)lpPar;
CString strNotice; /* 通知消息 */
while(1)
{
Sleep(10);
/* 创建通信套接字 */
SOCKET *pClientSocket = new SOCKET;
*pClientSocket = ::accept(pThis->listensocketfd, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(INVALID_SOCKET == *pClientSocket)
{
strNotice = "accept()失败,再次尝试 ...... ";
::AfxMessageBox(strNotice);
continue;
}
DWORD dwThreadId = 1;
/* 启动相应线程与客户端通信 */
pThis->m_hRespondThread = ::CreateThread(NULL, NULL, CTCPServerDlg::RespondProc, ((LPVOID)pClientSocket), 0, &dwThreadId);
CloseHandle(pThis->m_hRespondThread);
}
return 0;
}