是否应该用到多线程?

renren6250 2003-04-18 08:42:19
服务器端有一些文件,我想把这些文件同时拷到客户端,客户端有1000多个(它们也同时接受这些文件)。如果要用socket 编程,是否应该用到多线程?
我没有用多线程做过东西,所以来问一下,谢谢各位大虾了!
...全文
32 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aspist 2003-04-18
  • 打赏
  • 举报
回复
线程池
fang_jb 2003-04-18
  • 打赏
  • 举报
回复
给你写个简单的
server端:
InitSock()
//完成之后
WSAasyncSelect(servSock,m_hWnd,WM_CLIENT_MSG,FD_CONNECT|FD_READ)
//m_hWnd是窗口句柄,就是接收并处理WM_CLIENT_MSG的地方,WM_CLIENT_MSG是自定义消息

然后写一个函数处理WM_CLENT_MSG
OnClientMsg(WPARAM wParam,LPARAM lParam)
这个函数里就针对FD_CONNECT和FD_READ做处理
好象lParam是这两个消息,记不太清楚了,自己switch一下试试吧,
这样就可以自己不用管线程处理了
fang_jb 2003-04-18
  • 打赏
  • 举报
回复
如果你是用CSocket的话,那就用WSAasyncSelect这个函数来做处理,监视socket的读信息
针对,FD_READ做处理,处理函数就是把文件发送过去,你都不需要自己写线程,windows自己会处理线程的问题,你要做的就是消息处理,具体的你可以查一下WSAasyncSelect函数的使用

如果你要自己写的话,肯定需要每accept一个,就另外create一个线程和socket用来和客户端通讯,然后主线程仍旧在原端口上listen
renren6250 2003-04-18
  • 打赏
  • 举报
回复
to: fang_jb(寂寞如雪)
谢谢,我设计的是只有客户端向服务器端提出copy请求时,服务器端才向客户端copy的
renren6250 2003-04-18
  • 打赏
  • 举报
回复
to:fang_jb(寂寞如雪)
服务器端传文件的程序代码只要这样就行了吗?
LPCTSTR strFilename;
AfxSocketInit(NULL);
CSocket sockSrvr;
sockSrvr.Create(PORT); // Creates our server socket
sockSrvr.Listen(); // Start listening for the client at PORT
//???????????????
CSocket sockRecv;
//这个地方需不需要来一个客户就开一个线程,来让这个线程执行下面的代码,
//或者直接这样写就行,CSocket类,自己就会处理多个客户端来执行的文件传送。
//???????????????????
sockSrvr.Accept(sockRecv); // Use another CSocket to accept the connection
CFile myFile;
myFile.Open("C:\\ssreader.exe", CFile::modeRead | CFile::typeBinary);
rfilesize filecursize;
filecursize.strFilename="C:\\ssreader.exe";
filecursize.nFileSize=myFile.GetLength();
sockRecv.Send(&filecursize, sizeof(rfilesize)); // 先传此结构体
UINT dwRead=0;
while(dwRead<filecursize.nFileSize)
{
byte* data = new byte[1024];
UINT dw=myFile.Read(data, 1024);
sockRecv.Send(data, dw);
dwRead+=dw;
}
myFile.Close();

sockRecv.Close();
AfxMessageBox("发送完毕!");
}
fang_jb 2003-04-18
  • 打赏
  • 举报
回复
我建议你不要在服务器端主动向客户端copy,那样的话你需要记住所有的客户端,这样的服务器结构太有问题了
renren6250 2003-04-18
  • 打赏
  • 举报
回复
to:lanzhengpeng2(兰征鹏)
好像真的不需要为每一个客户端都开一个线程来传
fang_jb 2003-04-18
  • 打赏
  • 举报
回复
好象可以换一个角度考虑吧

服务器端向所有的客户端发一个广播消息,告诉有东西需要他们下载,然后各个客户端自己上来取东西,这样的话根本不用什么多线程,而且服务器端的程序也简单很读哦,客户端的程序也是统一的。

或者每个客户端在运行的时候都会做一个是否有文件需要下载的检测,这样就保证了服务器端和下面的分离,而且每个客户端都会收到数据,不会因为没开机或者其他原因而没有下载文件
renren6250 2003-04-18
  • 打赏
  • 举报
回复
to: uhlan(uhlan) dizzo(CEPC)
谢谢,不过我有一点很奇怪,我现在只有两个客户端来接受服务器端文件,服务器端没有
去判断是否有新的客户端来提出请求,然后再去开一个线程去处理这个请求。文件居然都传到
客户端去了.简单代码如下,
CSocket sockSrvr;
sockSrvr.Create(PORT); // Creates our server socket
sockSrvr.Listen(); // Start listening for the client at PORT
CSocket sockRecv;
sockSrvr.Accept(sockRecv); // Use another CSocket to accept the connection
pcitman 2003-04-18
  • 打赏
  • 举报
回复
多线程
而且要一个客户请求开辟一个线程
lanzhengpeng2 2003-04-18
  • 打赏
  • 举报
回复
是要使用多线程,但是不是为每一个客户端开一个线程传
dizzo 2003-04-18
  • 打赏
  • 举报
回复
参考一下MSDN里面的chat/chatsvr这两个例子,

多线程是必要的,为每一个客户端开一个线程传。
renren6250 2003-04-18
  • 打赏
  • 举报
回复
服务器端有一些文件,我想把这些文件同时拷到客户端,客户端有1000多个(它们也同时接受这些文件)。如果要用socket 编程,服务器端的代码是否应该用到多线程?
我没有用多线程做过东西,所以来问一下,谢谢各位大虾了!
uhlan 2003-04-18
  • 打赏
  • 举报
回复
肯定用多线程

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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