随便你保存在文件中或者注册表中。只要不保存在内存中就可以了。不过要记住下次运行时自己要先从文件或注册表中读出来。Windows不会自动帮你读出来的。
解决方案 »
- 从excel中查询插入到access中出错,解决就结贴
- DBGrid中数据输入后的类型检测问题
- 问一个比较菜的问题,请各位高手赐教!!!感激!!!
- 2002年度CSDN-DELPHI论坛精华帖评选投票活动正式开始。请到http://windindance.126.com参加投票
- php mysql
- 我原来用的宽带是单机用户,现在我想让几台机器共享,能实现吗?如能解决,高分相送。
- 高分求解!不用not in 怎么得到两个表的差集?
- 请问delphi处理excel.Caption标题会多出来一个 -book的问题!谢谢
- 寻找andrew223(暴风雪),求SSL DEMO,谢谢!
- 怎样使dbgrid显示的字段的名称是中文的?
- 如何才能在DBGRID中显示带2位小数的数据?
- 关于Image控件
百联网讯社区群 中国软件 IT商务社区 软件商务社区 图片商务社区 轴承商务社区
返回主页 新闻聚焦 共享软件 行业软件 Linux园地 开发中心 专家门诊 项目交易 人力资源
所有待解决的问题
所有已解决的问题
所有精华区的问题
我的问题 系统功能
修改注册信息
本月专家榜
总专家榜
热点问题
在线名单 计算机用户
软件使用
资源使用
软件注册
我看软件
寻找软件
行业软件
软件评测
Windows95/98
Windows NT/2000
DOS
Linux/UNIX
硬件指南 软件开发者
Visual C++
Visual Basic
Delphi
C/C++
C++ Builder
ASM
数据库开发
PowerBuilder
ActiveX/COM
数据算法
软件工程
图形/游戏/多媒体
安全技术
网络/通讯
技术书籍
文件格式 Web开发者
主页制作
图形处理
ASP
PHP
Perl
Java
Javascript 扩充话题
程序人生
软件市场
程序员考试
人才热线
建议和意见
灌水乐园
我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口
主 题:我想用vc++6编写一通用的socket程序,可在两台机器间传送文件
作 者:gunboy
所属论坛:Visual C++
问题点数:50
回复次数:8
发表时间:2000-4-19 23:00:00
我想用vc++6编写一通用的socket程序,可在两台机器间传送文件,请把源代码mail到
[email protected]。我想通过它学习网络编程
最好能用MFC的类CAsyncSocket。
谢谢
回复贴子:
回复人:duhaohao(2000-4-20 1:31:00) 得50分
服 务 器 与 客 户 机
互 传 消 息
南 京 理 工 大 学(960611)
朱 晓 华([email protected]) 一、 服 务 器 程 序
创 建 一 个 名 为“server" 的 项 目, 单 文 档 界 面。
在serverview.h 中 加 入 代 码:
#include “winsock.h"
添 加 变 量:
CSize sizeTotal;// 控 制 滚 动 条
int count;// 信 息 条 数
CString m_data[1000];// 信 息 存 放
char Hostname[260];
char Hostaddress[20];// 主 机IP 地 址
SOCKET m_sock;
HANDLE m_hListenThread;// 线 程
BOOL m_bInitialized;// 是 否 初 始 化
WSADATA WSAData;
BOOL flag;
SOCKADDR_IN saClnt;
int saClntLen;
BOOL Isconnect;// 是 否 连 接
在serverview.cpp 中 重 载CServerView() 构 造 器, 创 建 并 绑 定 嵌 套 字:
CServerView::CServerView()
{ // TODO: add construction code here
Isconnect=FALSE;
flag=FALSE;
sizeTotal.cy=350;
sizeTotal.cx=300;
m_hListenThread;
count=5;
int status;
WSADATA wsaData;
m_data[0]=“initializing Windows Sockets DLL....";
if((status=WSAStartup(0x0101, &wsaData))==0)
{ m_data[0] +=“Succeeded";
m_bInitialized=TRUE;
}
else
{ m_bInitialized=FALSE;
}
m_sock=socket(AF_INET,SOCK_DGRAM,0);
m_data[1]=“Creating socket....";
if(m_sock==INVALID_SOCKET)
{ m_data[1] +=“Failed";
}
m_data[1] +=“Succeeded";
m_data[2]=“Binding socket....";
sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sa.sin_port=htons(5050);
if(bind(m_sock,(PSOCKADDR)
&sa,sizeof(sa))==SOCKET_ERROR)
{ m_data[2] +=“Failed";
closesocket(m_sock);
}
m_data[2] +=“Succeeded";
m_data[3]=“Creating listener thread....";
unsigned long idThread;
m_hListenThread=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)Listen,
(void if(m_hListenThread)
{ m_data[3] +=“Succeeded";
m_data[4] +=“Listening....";
}
else
m_data[4] +=“Failed";
}
在 析 构 函 数 中 完 成 必 需 的 清 除 操 作:
CServerView:: ~CServerView()
{ if(m_bInitialized)
WSACleanup();
closesocket(m_sock);
if(m_hListenThread)
::TerminateThread(m_hListenThread,0);
}
定 义 接 收 和 处 理 消 息 的 线 程:
long WINAPI Listen(CServerView *pView)
{ char msg[2000]=“";
int nchar;
SOCKADDR_IN saClnt;
int saClntLen;
while(1)
{ saClntLen=sizeof(saClnt);
nchar=recvfrom(pView ->m_sock,msg,1024,0,
(PSOCKADDR) &saClnt, &saClntLen);
if(nchar<0)
{ pView ->m_data[pView ->count + +] +
=“Error in recvfrom\n";
pView ->InvalidateRect(NULL);
}
else
{switch(msg[0])
{
case ‘A':
wsprintf(msg,“A:Client from %s attached\n",
inet_ntoa(saClnt.sin_addr));
pView ->m_data[pView ->count + +]=msg;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
pView ->Isconnect=TRUE;
pView ->saClnt=saClnt;
pView ->saClntLen=saClntLen;
sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
&saClnt,saClntLen);
break;
case ‘D':
wsprintf(msg,“D: Client form %s detached\n",
inet_ntoa(saClnt.sin_addr));
pView ->m_data[pView ->count + +]=msg;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
pView ->Isconnect=FALSE;
sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
&saClnt,saClntLen);
break;
case ‘R':
saClntLen=sizeof(saClnt);
pView ->m_data[pView ->count + +]=msg;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
break;
default:
break;
}
}
}
return(0);
}
在 程 序 菜 单 项 中 添 加“ 本 机IP 地 址":
void CServerView::OnIp()
{int WSAReturn;
WSAReturn=WSAStartup( 0x0101, &WSAData );
if( WSAReturn == 0 ){
gethostname( Hostname, 260 );
struct hostent *pHostEnt;
pHostEnt = gethostbyname( Hostname);
if( pHostEnt != NULL ){
wsprintf( Hostaddress, “ %d. %d. %d. %d",
( pHostEnt ->h_addr_list[0][0] & 0x00ff ),
( pHostEnt ->h_addr_list[0][1] & 0x00ff ),
( pHostEnt ->h_addr_list[0][2] & 0x00ff ),
( pHostEnt ->h_addr_list[0][3] & 0x00ff ) );
CString out;
out.Format(Hostaddress);
AfxMessageBox(out);
}
}
}
在 程 序 菜 单 中 添 加“ 发 送 消 息":
void CServerView::OnSendmessage()
{// TODO: Add your command handler code here
char msg[2000];
Csend Sendmessage;
if(Sendmessage.DoModal()==IDOK
& &!Sendmessage.m_Message.IsEmpty())
{ wsprintf(msg,“R: " +Sendmessage.m_Message);
sendto(m_sock,msg,1024,0,(PSOCKADDR)
&saClnt,saClntLen);
m_data[count + +]=Sendmessage.m_Message;
flag=TRUE;
InvalidateRect(NULL);
}
}
为 发 送 消 息 项 添 加 一 个 对 话 框 的 类, 名 为send, 有 一 个 文 本 框, 用 来 发 送 消 息, 并
为 文 本 框 添 加CString m_Message 变 量, 在ServerView.cpp 中 添 加 #include “send.h"
为 发 送 消 息 项 添 加 一 个 判 断 函 数:
void CServerView::OnUpdateSendmessage(CCmdUI *
pCmdUI)
{// TODO: Add your command update UI handler code here
pCmdUI ->Enable(FALSE);
if(Isconnect)
pCmdUI ->Enable(TRUE);
}
再 窗 口 显 示 消 息:
void CServerView::OnDraw(CDC * pDC)
{ if(flag)
{sizeTotal.cy +=20;
for(int j=65;jTextOut(10,y,m_data[i]);
y +=20;}
// TODO: add draw code for native data here
}
在Project 中 点 击Settings 中 选 择Link 项 添 加wsock32.lib。
----最 后 编 译 程 序, 就 可 以 得 到Server.exe 程 序。
二、 客 户 机 程 序
创 建 一 个 名 为“client" 的 项 目, 单 文 档 界 面。
在clientview.h 中 加 入 代 码:
#include “winsock.h"
添 加 变 量:
CString m_data[1000];
HANDLE m_hListenThread;
SOCKET m_sock;
SOCKADDR_IN m_saSrvr;
BOOL Isconnect;
int count;
CSize sizeTotal;
BOOL flag;
在 构 造 函 数 中 初 始 化 变 量:
CClientView::CClientView()
{ // TODO: add construction code here
Isconnect=FALSE;
sizeTotal.cy=350;
sizeTotal.cx=300;
flag=FALSE;
}
在 析 构 函 数 中 完 成 清 除 操 作, 代 码 如 上。
在 菜 单 中 添 加“ 拨 号" 项:
void CClientView::OnDial()
{// TODO: Add your command handler code here
count=5;
if(m_bInitialized)
{ AfxMessageBox(“Already dialing");
return;}
Cdial dial;
if(dial.DoModal()==IDOK
& &!dial.m_HostAddress.IsEmpty())
{m_saSrvr.sin_family=AF_INET;
m_saSrvr.sin_addr.S_un.S_addr=htonl
(INADDR_ANY);
m_saSrvr.sin_addr.S_un.S_addr=inet_addr
(dial.m_HostAddress);
m_saSrvr.sin_port=htons(5050);
int status;
WSADATA wsaData;
m_data[0]=“initializing Windows Sockets DLL....";
if((status=WSAStartup(0x0101, &wsaData))==0)
{ m_data[0] +=“Succeeded";
m_bInitialized=TRUE;}
else
{ m_bInitialized=FALSE;}
m_sock=socket(AF_INET,SOCK_DGRAM,0);
m_data[1]=“Creating socket....";
if(m_sock==INVALID_SOCKET)
{ m_data[1] +=“Failed";}
m_data[1] +=“Succeeded";
m_data[2]=“Binding socket....";
sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sa.sin_port=htons(0);
if(bind(m_sock,(PSOCKADDR)
&sa,sizeof(sa))==SOCKET_ERROR)
{ m_data[2] +=“Failed";
closesocket(m_sock);}
m_data[2] +=“Succeeded";
m_data[3]=“Creating listener thread....";
unsigned long idThread;
m_hListenThread=CreateThread(NULL 0,
(LPTHREAD_START_ROUTINE)Listen,
(void *)this,0, &idThread);
if(m_hListenThread)
{ m_data[3] +=“Succeeded";
m_data[4] +=“Waiting....";}
else
m_data[4] +=“Failed";
InvalidateRect(NULL);
}
}
添 加 一 个 拨 号 对 话 框, 名 为dial, 有 一 个 文 本 框 用 来 写IP 地 址. 并 在clientview.cpp 中
添 加 代 码:
#include dial.h
在 拨 号 项 添 加 一 个 判 断 函 数:
void CClientView::OnUpdateDial(CCmdUI *
pCmdUI)
{// TODO: Add your command update UI handler code here
pCmdUI ->Enable(TRUE);
if(Isconnect)
pCmdUI ->Enable(FALSE);
}
添 加 接 收 与 发 送 消 息 的 线 程:
long WINAPI Listen(CClientView *pView)
{ char msg[2000];
pView ->m_data[5]=“Sending ATTACH command";
pView ->InvalidateRect(NULL);
wsprintf(msg,“A: ");
sendto(pView ->m_sock,msg,1024,0,(PSOCKADDR)
&pView ->m_saSrvr,sizeof(pView ->m_saSrvr));
int saSrvrLen ,nchar;
while(1)
{saSrvrLen=sizeof(pView ->m_saSrvr);
nchar=recvfrom(pView ->m_sock,msg,1024,0,
(PSOCKADDR) &pView ->m_saSrvr, &saSrvrLen);
if(nchar<0)
{ pView ->m_data[pView ->count + +]=
“Error in recvform";
pView ->InvalidateRect(NULL);}
else
{ pView ->m_data[pView ->count + +]=msg;
pView ->Isconnect=TRUE;
pView ->flag=TRUE;
pView ->InvalidateRect(NULL);
}
}
return(0);
}
同 主 程 序 一 样 做 一 个 发 送 消 息 项, 代 码 如 上。
显 示 程 序 也 与 主 程 序 一 样, 代 码 如 上。
在Project 中 点 击Settings 中 选 择Link 项 添 加wsock32.lib。
编 译 程 序 便 可 得 到client.exe 程 序。
----server.exe 和 client.exe 做 完 后, 就 可 以 在 具 有 TCP/IP 协 议 下 的 网 络 中 执 行。
回复人:wuzhouqun(2000-8-29 13:50:00) 得0分
关注!
回复人:lgs(2000-9-14 13:21:00) 得0分
我发送给你。
回复人:slssw(2000-9-19 8:28:00) 得0分
我是一个新手,想请问一下,这个程序我一直编译不过去,错误为:
serverView.cpp(80) : error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)'
None of the functions with this name in scope match the target type
80行程序为:m_hListenThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Listen,(void *)this,0,&idThread);
我检查了很长时间,也找不出问题。希望能得到你的答复。 我的email地址为:[email protected]
回复人:huangzubin(2000-10-12 19:50:00) 得0分
use CSocketFile
回复人:scklotz(2000-10-28 10:29:00) 得0分
参数类型不合适,把代码给我一份,我帮你瞧瞧
回复人:softarts(2000-10-28 19:03:00) 得0分
我做过一个com组件,发送400m的文件都没问题
回复人:bclzi(2000-11-9 20:45:00) 得0分
用 CSocket和CSocketFile不是更方便吗?
--------------------------------------------------------------------------------
我要回复: 有人参与讨论这个问题,请用EMail通知我
返回问题 | 关闭窗口
两种都行了,不过用INI文件的较多,用函数GetPrivateProfileString读取,用函数
WritePrivateProfileString写入就可以了
示例代码如下:
//读出注册表
m_Registry = new TRegistry;
if (m_Registry->OpenKey("Software\\Mytest",true))
{
Edit1->Text = m_Registry->ReadString("IPAddress");
Edit2->Text = m_Registry->ReadString("Port");
}
m_Registry->CloseKey();
m_Registry->Free(); //写入注册表
m_Registry = new TRegistry;
if (m_Registry->OpenKey("Software\\Mytest",true))
{
m_Registry->WriteString("IPAddress",Edit1->Text);
m_Registry->WriteString("Port",Edit2->Text);
}
m_Registry->CloseKey();
m_Registry->Free();
//读出注册表
m_Registry = new TRegistry;
if (m_Registry->OpenKey("Software\\Mytest",true))
{
Edit1->Text = m_Registry->ReadString("IPAddress");
Edit2->Text = m_Registry->ReadString("Port");
}
m_Registry->CloseKey();
m_Registry->Free(); //写入注册表
m_Registry = new TRegistry;
if (m_Registry->OpenKey("Software\\Mytest",true))
{
m_Registry->WriteString("IPAddress",Edit1->Text);
m_Registry->WriteString("Port",Edit2->Text);
}
m_Registry->CloseKey();
m_Registry->Free();