我在做一个多线程下载工具,客户端和服务器端都需实现
服务器端:
在Menu上有一个“服务器”选项,服务器下有一个“启动”选项。
在“启动”中响应以下函数
void CServerView::OnStart() 
{
if(m_start)
{
CMainFrame* pWnd = ( CMainFrame* )AfxGetMainWnd();
CServerApp* pApp = ( CServerApp* )AfxGetApp();
DWORD dwthread;
sockaddr_in local;
SOCKET m_socket; int rc=0;

m_socket=socket(AF_INET,SOCK_STREAM,0);
local.sin_family=AF_INET;
local.sin_port=htons(1028);
local.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

rc = bind( m_socket, (LPSOCKADDR)&local, sizeof(local) );
::CreateThread( NULL, 0, listenthread, (LPVOID)m_socket, 0, &dwthread );
CString aaa;
aaa = "服务器启动!\n"; Message( aaa.GetBuffer(0), RGB(0, 0, 0 ) );//这是一个自己定义在窗口上输入文本信息的函数
aaa.ReleaseBuffer();
CString strT;
strT = "NetSwallow(测试版)----服务器已经启动,当前IP为" + pApp->m_strIp + "  开放端口号为1028";
pApp->m_pMainWnd->SetWindowText(strT);
m_start = FALSE;
}
else
{
CString aaa;
aaa = "服务器已经启动了!\n";

Message( aaa.GetBuffer(0), RGB(0,0,0));
aaa.ReleaseBuffer();
}
}//监听线程
DWORD WINAPI listenthread(LPVOID lpparam)
{
SOCKET pthis = (SOCKET)lpparam; int rc = listen(pthis, 30);
if( rc < 0 )
{
CString aaa;
aaa = "listen错误\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1 );
aaa.ReleaseBuffer();
return 0;
}
while( 1 )
{
SOCKET s1;
s1 = accept( pthis, NULL, NULL );
CString aa;
aa = "一人联入!\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1 );
aa.ReleaseBuffer();
DWORD dwthread;
::CreateThread( NULL, 0, clientthread, (LPVOID)s1, 0, &dwthread );
}
return 0;
}客户端:
同样有一个“联接”选项并有如下响应函数
void CClient1View::OnConnect() 
{
CString aaa;

down[0]=new cdownload(0);//cdownload是一个下载类
int cc=down[0]->sendlist();
if(cc!=-1)
{
aaa="传圣(测试版) 1.0----客户端已启动";
pApp->m_pMainWnd->SetWindowText(aaa);
}
}int cdownload::sendlist()
{
sockaddr_in local;
SOCKET m_socket;int rc=0;
 m_socket=socket(AF_INET,SOCK_STREAM,0);
local.sin_family=AF_INET;
local.sin_port=htons(1028);
local.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");int ret=connect(m_socket,(LPSOCKADDR)&local,sizeof(local));
if(ret<0)
{
  CString aaa;
  aaa="服务器接不上!\n";
  AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
  aaa.ReleaseBuffer();
  closesocket(m_socket);
  return -1;
}
return 1;
}本人是个刚学vc++的新手,代码有点长,还希望大家帮帮忙。
谢谢了

解决方案 »

  1.   

    将线程中的这部分代码移到线程外
    SOCKET pthis = (SOCKET)lpparam; int rc = listen(pthis, 30);
    if( rc < 0 )
    {
    CString aaa;
    aaa = "listen错误\n";
    AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1 );
    aaa.ReleaseBuffer();
    return 0;
    }
    -----------------
    ......
    rc = bind( m_socket, (LPSOCKADDR)&local, sizeof(local) );
    <-移动到这儿
    ::CreateThread( NULL, 0, listenthread, (LPVOID)m_socket, 0, &dwthread );