CSocket和多线程问题?

freeinsky 2003-09-03 10:17:19
我在服务器端利用一个侦听线程来接收客户端的请求

当有客户联接时,就为他开两个线程,一个是接收的,一个侦听的,

由于我用的是CSocket来做为当中的socket口,
可当服务器accept时,得到了相应和客户服务的Csocket对象,
可当传给线程时,就会出现问题,这是为什么呢?
当accept时,我用一个全局变量csocket派生类来做为和客户端的通信的csocket对象,可一进入相应的线程就出现问题了

请大伙说说当中的情况,或有什么好方法来处理,

谁有相应的事件响应等的例子,

我只是想用TCP来传文件
...全文
477 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeinsky 2003-09-08
  • 打赏
  • 举报
回复
#define G_PORT 34568 //定义服务器端口
#define BUFFSIZE 8192
UINT _RecvDataThread(LPVOID lparam)
{

CServDlg *pDlg=(CServDlg *)lparam;
char szbuff[BUFFSIZE] = {0};
FILE *fp;

fp = fopen("recvC.jpg","wb");
if (fp == NULL)
{
AfxMessageBox("fopen function Error!");
return -1;
}
int nRecvNum = 1;
while (1)
{
nRecvNum = pDlg->m_socketClient.Receive(szbuff, BUFFSIZE);
if (nRecvNum == 0)
{
break;
}
fwrite(szbuff,sizeof(char), nRecvNum, fp);
}
fclose(fp);
fp = NULL;
pDlg->m_socketClient.Close();
return 0;
}

// 创建侦听线程

UINT _ListenThread(LPVOID lparam)
{


CServDlg *pDlg=(CServDlg *)lparam;

//创建服务器CSocket
CSocket sockServ;

//指定服务端口
pDlg->m_nServPort = G_PORT;

//初始化CSocket
int nCreateSucceed;

nCreateSucceed = sockServ.Create(pDlg->m_nServPort);

if (nCreateSucceed == 0)
{
AfxMessageBox("_ListenThread Create Error!" + pDlg->GetError (GetLastError()));
return -1;
}

//开始侦听访客
int nListenSucceed;

nListenSucceed = sockServ.Listen();

if (nListenSucceed == 0)
{
AfxMessageBox("_ListenThread Listen Error!" + pDlg->GetError(GetLastError()));
return -1;
}


//当有请求连接时,则接收相应的请求
CSocket sockRecv;

SOCKADDR_IN ClientAddress;

int nAddressSize = sizeof(ClientAddress);

int nAcceptSucceed;

nAcceptSucceed = sockServ.Accept(pDlg->m_socketClient, (SOCKADDR *) & ClientAddress, &nAddressSize );

if (nAcceptSucceed == 0)
{
AfxMessageBox("_ListenThread Accept Error!" + pDlg->GetError(GetLastError()));
return -1;

}

//重新进行相应的侦听线程

pThreadLisen=::AfxBeginThread(_ListenThread,pDlg);

//开启相应的接收线程
pThreadClientRecv = ::AfxBeginThread(_RecvDataThread,pDlg);

//关闭相应的服务CSocket
sockServ.Close();
return 0;

}

程序死掉时,在接收文件recvC.jpg中,得到的数据有时多一点,有时少一点,
flinming 2003-09-08
  • 打赏
  • 举报
回复
int nRecvNum = 1;
while (1)
{
nRecvNum = pDlg->m_socketClient.Receive(szbuff, BUFFSIZE);
if (nRecvNum == 0)
{
break;
}
fwrite(szbuff,sizeof(char), nRecvNum, fp);
}

这段代码觉得你不应该这样判断

建议你服务器发送代码也贴出来,还有数据接收问题,数据多少的问题,先去排除服务器数据是否少发的问题。
服务器发送一定要判断是否完全发送数据,非常重要。。
sumkeen 2003-09-08
  • 打赏
  • 举报
回复
传参数,不要使用全局变量,用一个做侦听,得到SOCKET后交给另外的线程做处理。。

1.侦听SOCKET:
Accept(m_AsyncSocket));
m_socket=m_AsyncSocket.Detach();

m_pWorkThread->PostThreadMessage(WM_ACCEPT_SOCKET,(WPARAM)m_socket,NULL);

2.工作者线程:
m_socket.Attach((SOCKET)wParam);
//执行任务
m_socket.GetPeerName(m_rPeerAddress,m_rPeerPort);
.
.
Work();
.
.
.

doughlus 2003-09-05
  • 打赏
  • 举报
回复
mfc 的多线程模型不支持对象共享,当然会出问题。我只这么做的,先开一个线程,侦听,连接,开另一个线程去侦听,连接,就不会出现你这样的问题。
bphantom 2003-09-05
  • 打赏
  • 举报
回复
UINT thread(LPVOID p)
{
char buff[100];
CString strReceived;
CString command;
int s=1,loop=0,i;
CSvrDlg* pDlg = (CSvrDlg*)AfxGetApp()->GetMainWnd();
for (i = 0;i<2;i++)
{
if(pDlg->msgsock[i] == NULL)
{
loop = 1;
break;
}
}
if(loop)
{
s=1;

pDlg->msgsock[i] = accept(pDlg->sock,(sockaddr*)&(pDlg->serv),
&(pDlg->nAddrLen));
if(pDlg->msgsock[i] == INVALID_SOCKET)
AfxMessageBox("Accept fail!");
else
{
AfxBeginThread(thread,0);//1没必要开两个线程;2多客户多msgsock[i]就行了。

//循环接收数据
while(s != SOCKET_ERROR){ //s != SOCKET_ERROR
s=recv(pDlg->msgsock[i],buff,100,0);
flinming 2003-09-05
  • 打赏
  • 举报
回复
应该不会吧!我做过很过类似的都没有发生过错误!
监听产生的套接字没有被你关闭吧!最好是你贴出代码让大家看看,就明白了,就你监听产生的套接字和线程。。
mct1025 2003-09-05
  • 打赏
  • 举报
回复
CSocket不能跨线程

用api函数吧
mixtrue 2003-09-05
  • 打赏
  • 举报
回复
楼主为什么不用ftp???????
LeoUltraman 2003-09-04
  • 打赏
  • 举报
回复
Simple,do it yourself

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧