关于TCP发送文件的问题

JZY4077 2011-12-08 07:04:08
最近在写关于服务端与客户端关于发送文件的程序,遇到了问题,把问题描述一下,希望可以得到大家们的帮助和解答!

在这个程序中我使用的是WSAAsyncSelect。

通过按键消息来决定服务器是否向客户端发送文件,这个FD_WRITE消息应该怎么去设置?是在接受客户端连接是就把FD_WRITE消息写进WM_SOCKET消息中,还是触发按键消息后再去产生FD_WRITE消息?

当服务端准备向客户端发送文件时,客户端需要进行一个选择是否接受这个文件,那么对于客户端来说FD_READ消息应该写在什么地方?是在处理FD_CONNECT消息时就调用WSAAsyncSelect(Client_Socket, hWnd, WM_SOCKET, FD_READ)这个函数,还是应该在选择准备接受这个文件时调用WSAAsyncSelect(Client_Socket, hWnd, WM_SOCKET, FD_READ)呢?

服务端准备向客户端发送消息,告诉客户端准备接受这个文件内容,对客户端来说,在建立与服务端的连接即调用connect函数时,是否需要调用WSAAsyncSelect(Client_Socket, hWnd, WM_SOCKET, FD_READ),这样就可以接受服务端准备向客户端发送文件的通知?

说了这么多,不知道看这篇帖子的朋友们有没有明白,所以为了大家能够明白我所遇到了问题是什么,我把我的代码简单的贴出来,再次希望可以得到大家们的帮助!


这是服务端的大概代码:
BOOL WINAPI DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
//初始化对话框
return FALSE;
case WM_COMMAND:
//接受“按键”消息
switch(LOWORD(wParam))
{
case IDC_OPEN:
//建立一个服务器,并创建套接字,进行监听,
/*
*************这是大概代码*****************
... .... .... ....
SOCKET Listen_Socket;
bind(Listen_Socket, (SOCKADDR *)&Server_Addr, sizeof(Server_Addr));
WSAAsyncSelect(Listen_Socket, hWnd, WM_SOCKET, FD_ACCEPT);//这个时候,是否应该调用这个函数?
listen(Listen_Socket, 2); //Listen_Socket进行监听
}
*/
break;
case IDC_CLOSE:
//关闭服务器
break;
case IDC_CHOOSEFILE:
//选择一个文件,用来发送给客户端
break;
case IDC_SEND:
//点击“发送”按钮,准备发送给客户端,FD_WRITE这个发送消息该怎么写?
//是应该在处理这个按键消息时调用WSAAsyncSelect(套接字, hWnd, WM_SOCKET, FD_WRITE)这个函数?
break;
}
return TRUE;

case WM_SOCKET:
{
case FD_ACCEPT:
//与客户端建立连接
//是否应该这个时候调用WSAAsyncSelect(套接字, hWnd, WM_SOCKET, FD_WRITE)函数?
case FD_READ:
//发送文件内容给客户端
break;
... ....
}
return TRUE;
... ....
... ....
}
}


这是客户端的大概代码:

BOOL WINAPI DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
//初始化对话框
return FALSE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_CONNECT:
//处理“按键”消息,与服务端建立连接
/*
*************大概代码**************
.... ..... .....
.... ..... .....
SOCKET Client_Socket;
connect(Client_Socket, (SOCKADDR *)&Server_Addr, sizeof(Server_Addr);
WSAAsyncSelect(Client_Socket, hWnd, WM_SOCKET, FD_READ);//是否应该在这里调用该函数?
*/
break;
case IDC_CLOSE:
//关闭客户端建立的连接
break;
}
return TRUE;
case WM_SOCKET:
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
/*
在这里有一个判断,是否打算接受服务器发送的文件
if(IDYES == MessageBox(.. .. .. ..))
{
//接受文件代码
}
*/
}
return TRUE;
case WM_CLOSE:
//关闭对话框,程序结束
return TRUE;
}
return FALSE;
}
...全文
99 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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