unhandled exception in **.exe(MFC42D.DLL)

hwer880111 2012-02-20 09:33:14
代码如下:
UINT MTServerThread(LPVOID pParam); //线程
//BOOL SendFile(CSocket s, CString fname);//函数声明有问题...----
BOOL SendFile(SOCKET s, CString fname);
UINT ServerThread(LPVOID pParam)
{
CString params;
char buff[512];
bool j;

HWND hDlg= FindWindow(NULL,"realserver");
CListBox *m_list = (CListBox *)GetDlgItem(hDlg,IDC_LIST1); // 在此添加额外的初始化代码

SOCKET client=(SOCKET )pParam;
params.Format("Starting up TCP server\r\n");
m_list->AddString(params);

// SOCKET实际上是一个unsigned int类型
SOCKET server;
// WSADATA结构将有WSAStartup函数来填充
WSADATA wsaData;
// 对TCP/IP 套接字来说,sockaddr_in结构指定了套接字的地址
// 其他协议使用相似的结构
sockaddr_in local;
// WSAStartup函数负责加载Winsock库的函数
// 第一个参数用来指定想要加载的Winsock库的版本
int wsaret=WSAStartup(0x101,&wsaData);
// 调用成功,WSAStartup函数返回0
// 失败的话,程序就退出
if(wsaret!=0)
{
return 0;
}
// 现在我们填充sockaddr_in结构
local.sin_family=AF_INET; // 地址家族Address family
local.sin_addr.s_addr=INADDR_ANY; // 要求使用当前主机配置的所有IP地址
local.sin_port=htons((u_short)20248); // 使用的端口
// socket函数用来创建我们的SOCKET
server=socket(AF_INET,SOCK_STREAM,0);
// 如果socket()函数调失败,我们退出
if(server==INVALID_SOCKET)
{
return 0;
}
// 为套接字关联本地地址的函数是bind.
// bind函数用在没有建立连接的套接字上,它的作用是绑定面向连接的或者无连接的套接字。
// 套接字被socket函数创建以后,存在于指定的地址家族里,但它是未命名的。
// bind函数通过安排一个本地名称到未命名的socket建立此socket的本地关联。
// 本地名称包含3个部分:主机地址、协议号(分别为UDP或TCP)和端口号。
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
return 0;
}
// listen函数设置套接字进入监听状态
// 为了接受连接,首先使用socket函数创建一个套接字,然后使用bind函数将它绑定到一个本地地址,
// 再用listen函数为到达的连接指定一个backlog,最后使用accept接受请求的连接。
// 函数的第二个参数是backlog值
if(listen(server,10)!=0)
{
return 0;
}
// 我们需要变量在保存客户套接字,下面是这些变量的定义

sockaddr_in from;
int fromlen=sizeof(from);
// 下面进入无限循环
while(true)
{
char temp[512];
// accept() 将接受到了的客户连接
client=accept(server,(struct sockaddr*)&from,&fromlen);

j=SendFile(client,params);
while(j=true)
{
params.Format("File sent successfully\r\n");
m_list->AddString(params);
break;
}


// 关闭客户套接字
closesocket(client);
}
// closesocket()关闭套接字,并且释放套接字描述表
closesocket(server);
// 每一个对WSAStartup的调用必须对应一个对WSACleanup的调用,这个函数释放Winsock库
WSACleanup();
return 0;
}


void CRealserverDlg::OnButton1()
{

AfxBeginThread(ServerThread,0);

}


void CRealserverDlg::OnSelchangeList1()
{
// TODO: Add your control notification handler code here

}






// int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
// {
// int nRetCode = 0;
// cout << "Press ESCAPE to terminate program\r\n";
// AfxBeginThread(ServerThread,0);
// while(_getch()!=27);
// return nRetCode;
// }



BOOL SendFile(SOCKET s, CString fname)
{
CFile f;
BOOL p=f.Open("e:\\wanna.mp3",CFile::modeRead);
char buff[1024];
int y;
int x;
if(!p)
return false;
while(true)
{
y=f.Read(buff,1024);
x=send(s,buff,y,0);
if(y<1024)
{
f.Close();
break;
}
}
return true;
}
编译通过后,运行后没有错误。点击BOTTON1,出现如下问题:
unhandled exception in **.exe(MFC42D.DLL),0xC0000005.Access violation.
...全文
307 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyx100 2012-02-22
  • 打赏
  • 举报
回复
数组越界、指针、文件读取,dll版本检查一下
oyljerry 2012-02-22
  • 打赏
  • 举报
回复
检查各种指针对象等是否为NULL,代码有指针越界等
fishion 2012-02-20
  • 打赏
  • 举报
回复
hDlg得判断下是否是空的,m_list也得判断下是否是NULL 。
SOCKET client=(SOCKET )pParam;这句也没必要这样用,直接SOCKET client;
问题还不少呀
罗平 2012-02-20
  • 打赏
  • 举报
回复
可能数组越界。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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