各位尊敬的前辈,我在此真诚请教一下问题:
我写了个局域网通信程序:类似飞鸽的功能(没那么强),我动态获取用户在线信息正常(通过创建一个广播套接字,绑定窗口事件),但在文件传递时出现了问题。
我在程序启动后立即开启服务器:
void CTransferInfor::StartServer()
{
m_psockServer = new CListenSocket(this);
if(!m_psockServer->Create(m_port))
{
delete m_psockServer;
m_psockServer = NULL;
MessageBox(GetError(GetLastError()), _T("错误"), MB_ICONHAND);
return ;
}
//监听客户端连接
if(!m_psockServer->Listen())
{
delete m_psockServer;
m_psockServer = NULL;
MessageBox(GetError(GetLastError()), _T("错误"), MB_ICONHAND);
return ;
}
}对方连接时时正常的,我发送的一些响应信息能正常收到(文件名,大小,以及各种响应信息)我在在收到对方发过来的传送文件请求信息后,创建线程来发送文件:
注:pMsg 时我封装的一个消息类
if(pMsg->m_nType == REQUEST)//收到
{
m_bIsWait = TRUE; //是否已经取消传递的标记
m_strFileName = pMsg->m_strFileName;
m_dwFileSize = pMsg->m_dwFileSize;
CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件 (*.*)|*.*||", this);
dlg.m_ofn.lpstrTitle = _T("另存为");
strcpy(dlg.m_ofn.lpstrFile, m_strFileName.GetBuffer(m_strFileName.GetLength()));
if(dlg.DoModal() == IDOK)
{
if(m_bIsWait == FALSE)//若对方已经取消等待
{
MessageBox(_T("对方已经取消文件发送"), _T("警告"),MB_ICONEXCLAMATION);
return ;
}
m_strPath = dlg.GetPathName();//获取保存路径
//启动接收文件的线程
pThreadListen = ::AfxBeginThread(_ListenThread, this);
return ;
}
........................我的线程函数如下:
UINT _ListenThread(LPVOID lparam)
{
CTransferInfor* pDlg = (CTransferInfor*)lparam;
CSocket* sockSrvr;
sockSrvr = new CSocket;
/*注释:程序就在此处崩溃,直接跳出,也不跳出括号中的错误提示!”
if(!sockSrvr->Create(pDlg->m_port + 1000))
{
delete sockSrvr;
sockSrvr = NULL;
::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}
if(!sockSrvr->Listen())
{
//pDlg->TransfersFailed();
delete sockSrvr;
sockSrvr = NULL;
::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}
pDlg->SendMessage(WM_ACCEPT_TRANSFERS);//启动定时器标记,防止延时,在该函数里向对方发送消息:同意接收
//接受连接
CSocket recSo;
if(!sockSrvr->Accept(recSo))
{
AfxMessageBox("Accept失败!");
//::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
} sockSrvr->Close();
AfxMessageBox("文件传递启动!");
pDlg->ReceiveFile(recSo);//具体的接受函数
return 0;
}
.........................请教各位,谁能给我指点一下原因,我始终不得其解。谢谢了
我写了个局域网通信程序:类似飞鸽的功能(没那么强),我动态获取用户在线信息正常(通过创建一个广播套接字,绑定窗口事件),但在文件传递时出现了问题。
我在程序启动后立即开启服务器:
void CTransferInfor::StartServer()
{
m_psockServer = new CListenSocket(this);
if(!m_psockServer->Create(m_port))
{
delete m_psockServer;
m_psockServer = NULL;
MessageBox(GetError(GetLastError()), _T("错误"), MB_ICONHAND);
return ;
}
//监听客户端连接
if(!m_psockServer->Listen())
{
delete m_psockServer;
m_psockServer = NULL;
MessageBox(GetError(GetLastError()), _T("错误"), MB_ICONHAND);
return ;
}
}对方连接时时正常的,我发送的一些响应信息能正常收到(文件名,大小,以及各种响应信息)我在在收到对方发过来的传送文件请求信息后,创建线程来发送文件:
注:pMsg 时我封装的一个消息类
if(pMsg->m_nType == REQUEST)//收到
{
m_bIsWait = TRUE; //是否已经取消传递的标记
m_strFileName = pMsg->m_strFileName;
m_dwFileSize = pMsg->m_dwFileSize;
CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件 (*.*)|*.*||", this);
dlg.m_ofn.lpstrTitle = _T("另存为");
strcpy(dlg.m_ofn.lpstrFile, m_strFileName.GetBuffer(m_strFileName.GetLength()));
if(dlg.DoModal() == IDOK)
{
if(m_bIsWait == FALSE)//若对方已经取消等待
{
MessageBox(_T("对方已经取消文件发送"), _T("警告"),MB_ICONEXCLAMATION);
return ;
}
m_strPath = dlg.GetPathName();//获取保存路径
//启动接收文件的线程
pThreadListen = ::AfxBeginThread(_ListenThread, this);
return ;
}
........................我的线程函数如下:
UINT _ListenThread(LPVOID lparam)
{
CTransferInfor* pDlg = (CTransferInfor*)lparam;
CSocket* sockSrvr;
sockSrvr = new CSocket;
/*注释:程序就在此处崩溃,直接跳出,也不跳出括号中的错误提示!”
if(!sockSrvr->Create(pDlg->m_port + 1000))
{
delete sockSrvr;
sockSrvr = NULL;
::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}
if(!sockSrvr->Listen())
{
//pDlg->TransfersFailed();
delete sockSrvr;
sockSrvr = NULL;
::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}
pDlg->SendMessage(WM_ACCEPT_TRANSFERS);//启动定时器标记,防止延时,在该函数里向对方发送消息:同意接收
//接受连接
CSocket recSo;
if(!sockSrvr->Accept(recSo))
{
AfxMessageBox("Accept失败!");
//::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
} sockSrvr->Close();
AfxMessageBox("文件传递启动!");
pDlg->ReceiveFile(recSo);//具体的接受函数
return 0;
}
.........................请教各位,谁能给我指点一下原因,我始终不得其解。谢谢了
1. if(!AfxSocketInit()){
mwnd->MessageBox(_T("套接字初始化问题!请重试!"),_T("内部错误"));
return 1;
}
2. if(!serversocket.Socket()){
mwnd->MessageBox(_T("套接字初始化问题!请重试!"),_T("内部错误"));
return 1;
}
CString sstr;
3. if(!serversocket.Bind(ntser->GetPort(),ntser->GetIp())){
mwnd->MessageBox(_T("端口绑定错误!请重试!"),_T("内部错误"));
return 1;
}
4. if(!serversocket.Listen(10)){
mwnd->MessageBox(_T("系统监听设置出现问题!请重试"),_T("内部错误"));
return 1;
}
下面是实现的代码测试过可以用但只是基本通信:
服务端的:
CWinThread *pthread=NULL;
UINT StartNetWork(LPVOID argv){
if(!AfxSocketInit()){
AfxMessageBox(_T("套接字无法初始化!"));
AfxGetApp()->m_pMainWnd->PostMessage(WM_QUIT);
}
CSocket server;
//CSocket server;
if(!server.Socket()){
AfxMessageBox(_T("套接字进一步初始化出现问题"));
AfxGetApp()->m_pMainWnd->PostMessage(WM_QUIT);
}
if(!server.Bind(1000)){
AfxMessageBox(_T("套接字绑定端口出现问题"));
AfxGetApp()->m_pMainWnd->PostMessage(WM_QUIT);
}
if(!server.Listen(20)){
AfxMessageBox(_T("套接字监听设置出现问题"));
AfxGetApp()->m_pMainWnd->PostMessage(WM_QUIT);
}
CSocket acsock;
AfxMessageBox(_T("successfull!"));
while(true){
if(!server.Accept(acsock)){
continue;
}else{
char recemsg[256]={0};
acsock.Receive(recemsg,256);
AfxMessageBox(recemsg);
acsock.Send("I Get Message!\0",30);
acsock.Close();
}
客户端的(嵌入到你的请求函数):
AfxSocketInit();
CSocket csocket;
if(!csocket.Create()){
MessageBox(_T("客户端初始化失败"));
this->PostMessage(WM_QUIT);
}
if(!csocket.Connect("127.0.0.1",1000)){
char szMsg[1024]={0};
sprintf(szMsg, "create faild: %d", csocket.GetLastError());
AfxMessageBox(szMsg);
this->PostMessage(WM_QUIT);
}else{
char szRecValue[1024] = {0};
CString strText="dddddddddddd\0";
csocket.Send(strText, strText.GetLength());
csocket.Receive((void *)szRecValue, 1024);
AfxMessageBox(szRecValue);
} 最后一点基于CSocket的文件传输最好把文件分割传输(好像TCP虽然是流传输但是一次send最好在5k一下)。
UINT _ListenThread(LPVOID lparam)
{
CTransferInfor* pDlg = (CTransferInfor*)lparam;
CSocket* sockSrvr;
sockSrvr = new CSocket;
/*注释:程序就在此处崩溃,直接跳出,也不弹出括号中的错误提示!”
if(!sockSrvr->Create(pDlg->m_port + 1000))
{
delete sockSrvr;
sockSrvr = NULL;
::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}
.......................
UINT _ListenThread(LPVOID lparam)
{
CTransferInfor* pDlg = (CTransferInfor*)lparam;
CSocket* sockSrvr;
sockSrvr = new CSocket;
/*注释:程序就在此处崩溃,直接跳出,也不弹出括号中的错误提示!”
if(!sockSrvr->Create(pDlg->m_port + 1000))
{
delete sockSrvr;
sockSrvr = NULL;
::MessageBox((HWND)lparam, pDlg->GetError(GetLastError()), _T("错误"), MB_ICONHAND|MB_OK);
return -1;
}
.......................
pThreadListen = ::AfxBeginThread(_ListenThread, this); 这个this 能明确是谁吗
能不能先改成 CSocket sockSrvr; 试一下?
pThreadListen = ::AfxBeginThread(_ListenThread, this); 后加::Sleep(500000);試一試
不过楼上想法应该试试
CListenSocket* m_psockServer;//用于监听
CClientSocket* m_psockClient;//用于连接,
他们通过CArchive 传输控制信息,
在程序中,这些控制信息都对的,当满足条件时,创建线程传文件或接收文件,现接收文件那个线程有问题,我重新创建一个CSocket socketServer用于监听,(端口已重新绑定),发送线程重新创建一个CSocket套接字用于传送,我想会不会是我前面那个m_psockServer 影响到了新的套接字的创建,他们使用同一个IP,但不同端口?
你在cmd下用netstat看看端口情況
通过lparam传递到线程中去