15,466
社区成员
发帖
与我相关
我的任务
分享
//服务器端创建accept线程
DWORD WINAPI CSocketDlg::clientthreadproc(LPVOID lpParameter)
{
SOCKET s;
SOCKADDR_IN skt_addr;
int len=sizeof(sockaddr);
s=accept(((threaddata*)lpParameter)->skt,(sockaddr*)&skt_addr,&len);
while(TRUE)
{
if(s!=INVALID_SOCKET)
{
HANDLE tempthreadhandle;
threaddata* trdd1=new threaddata;
trdd1->hwnd=((threaddata*)lpParameter)->hwnd;
trdd1->skt=s;
trdd1->addr=skt_addr;
CreateThread(NULL,0,chatproc,LPVOID(trdd1),0,NULL);
CloseHandle(tempthreadhandle);
}
}
delete (threaddata*)lpParameter;
return 0;
}
//m_skt是CSocketDlg的SOCKET成员
BOOL CSocketDlg::InitSocket(void)
{//协议版本
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
AfxMessageBox(_T("Can not find WinSocket Dll!"));
return FALSE;
}
if ( LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2 ) {
AfxMessageBox(_T("Can not find a useful WinSocket Dll!"));
WSACleanup( );
return FALSE;
}
//创建套接字
m_skt=socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
if(INVALID_SOCKET==m_skt)
{
AfxMessageBox(_T("Socket Create failed"));
return FALSE;
}
sockaddr_in sktsrvaddr;
sktsrvaddr.sin_family=AF_INET;
sktsrvaddr.sin_port=htons(m_uPort);
sktsrvaddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.252");
//bind
if(SOCKET_ERROR==bind(m_skt,(sockaddr*)&sktsrvaddr,sizeof(sockaddr)))
{
closesocket(m_skt);
AfxMessageBox(_T("Bind failed"));
return FALSE;
}
//listen
if(SOCKET_ERROR==listen(m_skt,SOMAXCONN))
{
closesocket(m_skt);
AfxMessageBox(_T("Listen failed"));
return FALSE;
}
return TRUE;
}
struct threaddata //自定义结构体用来给线程函数传值
{
HWND hwnd;
SOCKET skt;
SOCKADDR_IN addr;
};
BOOL CSocketDlg::OnInitDialog()
{
//..... 略去MFC代码
if(InitSocket())//判断套接字是否创建绑定并监听
{
m_strReceive+=_T("\r\nTCP Socket Initialize successful!");
SetDlgItemText(IDC_RECEIVE,m_strReceive);
}
threaddata* trdd=new threaddata; //new一个自定义的结构体并赋值
trdd->hwnd=m_hWnd;
trdd->skt=m_skt;
//创建线程 我打算在新创建的线程里accept 如果accept到连接 就在此线程中再创建线程来通信
HANDLE clientthread=CreateThread(NULL,0,clientthreadproc,LPVOID(trdd),0,NULL);
CloseHandle(clientthread);
return TRUE;
}
DWORD WINAPI CSocketDlg::clientthreadproc(LPVOID lpParameter)
{
SOCKET s=INVALID_SOCKET; //初始化一个套接字变量为失败值
SOCKADDR_IN skt_addr;
int len=sizeof(sockaddr);
s=accept(((threaddata*)lpParameter)->skt,(sockaddr*)&skt_addr,&len); //监听... 这里出错 程序运行到这直接跳出线程函数 不运行下面的代码
while(TRUE)
{if(s!=INVALID_SOCKET)
{
HANDLE tempthreadhandle;
threaddata* trdd1=new threaddata; //new 结构体
trdd1->hwnd=((threaddata*)lpParameter)->hwnd;
trdd1->skt=s;
trdd1->addr=skt_addr;
CreateThread(NULL,0,chatproc,LPVOID(trdd1),0,NULL); //创建线程用来通信
CloseHandle(tempthreadhandle);
}
}
delete (threaddata*)lpParameter;
return 0;
}
if(InitSocket())
{
m_strReceive+=_T("\r\nTCP Socket Initialize successful!");
SetDlgItemText(IDC_RECEIVE,m_strReceive);
}
threaddata* trdd=new threaddata;
trdd->hwnd=m_hWnd;
trdd->skt=m_skt;
HANDLE clientthread=CreateThread(NULL,0,clientthreadproc,LPVOID(trdd),0,NULL);
CloseHandle(clientthread);
s=accept(((threaddata*)lpParameter)->skt,(sockaddr*)&skt_addr,&len);