• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

面向连接的套接字连接失败,不懂!请大哥大姐们指点!在线等!

jasonM2008 2008-04-19 08:45:23
我做了一C/S的程序
首先我说明一下我程序出现的问题:
1.我先启动服务器端,然后建立服务器。
2.我启动客户端,连接,然后出现错误:
在客户端,显示连接失败,用GetLastError()获取错误为零!
然后服务器端也出现这样的问题:弹出一个对话框显示:
Tickets_Sell.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。
................


代码:
1,服务器端的主要代码如下:
void CTickets_SellView::OnBtnServer()
{
// TODO: Add your control notification handler code here
if(IsSetup==TRUE)
{
return;
}
//CServerSock Sock;
//CArray<CServerSock*,CServerSock*> data;
//pSock=new CServerSock();
Sock.InitSock(this);
BOOL result;
result=Sock.Create(9000,SOCK_STREAM);
if(result==FALSE)
{
Sock.Close();
CString errorcode;
errorcode.Format("%d",GetLastError());
errorcode+="创建套接字失败";
AfxMessageBox(errorcode);
return;
}
if(!Sock.Listen())
{
Sock.Close();
CString error;
error.Format("监听失败:%d",GetLastError());
AfxMessageBox(error);
return;
}
CString text;
CWnd *pWnd=NULL;
pWnd=GetDlgItem(IDC_STATIC_CONNNUM);
pWnd->SetWindowText("当前连数:0");
OnBtnSetup();
IsSetup=TRUE;
return;
}


客户端的主要代码如下:
void CClientSocket::ConnectionToServer(CString buffer)
{

struct in_addr addr_to;
if((addr_to.S_un.S_addr=inet_addr(buffer))== INADDR_NONE)
{
AfxMessageBox("IP地址格式不正确");
return ;
}
if(buffer.IsEmpty())
{
AfxMessageBox("请输入服务器IP地址");
return;
}
if(Create(7000)==FALSE)
{
Close();
CString error;
error.Format("创建套接字失败:%d",GetLastError());
AfxMessageBox(error);
}
/*CString address;
address.Format("%d",inet_addr(buffer));
AfxMessageBox(address);*/
SOCKADDR_IN addrto;
addrto.sin_family=AF_INET;
addrto.sin_addr.S_un.S_addr=inet_addr(buffer);
addrto.sin_port=htons(9000);
BOOL result;
result=Connect((SOCKADDR*)&addrto,sizeof(SOCKADDR));
if(result==FALSE)
{
Close();
CString error;
error.Format("连接服务器失败:%d",WSAGetLastError());
AfxMessageBox(error);
return ;
}


}

void CTickets_ClientDlg::OnConnect()
{
// TODO: Add your command handler code here
CWnd *pWnd;
pWnd=GetDlgItem(IDC_EDIT_IP);
CString buffer;
pWnd->GetWindowText(buffer);
//MessageBox(buffer);
//pClientSocket->InitSock(this);
pClientSocket->ConnectionToServer(buffer);//调用上面的函数!
}
...全文
362 点赞 收藏 23
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
luawkk 2008-04-22
初学者还是,用 socket api 自己封装一套类代码用于以后使用吧,不要用那些集成的,那样你不是很明白内部的运作机制,
回复
菜牛 2008-04-21
CServerSock Sock;
...
DataSock.Add(&Sock);
这是个局部变量啊。你保存这个指针没有意义。好好的代码被你改错了。
回复
shuishuiwawa 2008-04-21
好复杂啊
回复
baobao2010 2008-04-20
学习。
回复
jasonM2008 2008-04-20
错误代码为10014
回复
jasonM2008 2008-04-20
void CServerSock::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CServerSock Sock;
SOCKADDR_IN addrfrom;
int len;
if(!Accept(Sock,(SOCKADDR*)&addrfrom,&len))
{
AfxMessageBox("接受连接套接字失败");
Close();
return;
}
//Attach(pSock->m_hSocket);
DataSock.Add(&Sock);
CString text;
CWnd *pWnd=NULL;
pWnd=pView->GetDlgItem(IDC_STATIC_CONNNUM);
pWnd->GetWindowText(text);
CString num;
num.Format("%d",DataSock.GetSize());
text+=num;
pWnd->SetWindowText(text);
//AsyncSelect(FD_WRITE);

CAsyncSocket::OnAccept(nErrorCode);
}
我把他改成这样了,调试发现每次连接的时候这个函数就报错,连接失败!单不知道原因,请各位看看!
回复
jasonM2008 2008-04-20
void CServerSock::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CServerSock *pSock=NULL;
SOCKADDR_IN addrfrom;
int len;
if(!Accept(*pSock,(SOCKADDR*)&addrfrom,&len))
{
AfxMessageBox("接受连接套接字失败");
Close();
return;
}
//Attach(pSock->m_hSocket);
DataSock.Add(pSock);
CString text;
CWnd *pWnd=NULL;
pWnd=pView->GetDlgItem(IDC_STATIC_CONNNUM);
pWnd->GetWindowText(text);
CString num;
num.Format("%d",DataSock.GetSize());
text+=num;
pWnd->SetWindowText(text);
//AsyncSelect(FD_WRITE);

CAsyncSocket::OnAccept(nErrorCode);
}
这是我服务器端的接受连接套接字的程序,请各位看看!
回复
jasonM2008 2008-04-20
class CClientSocket : public CAsyncSocket
回复
arong1234 2008-04-20
你要确保他用的是CAsyncSocket而不是CSocket哦?CAsyncSocket是不可能不出现这个的

[Quote=引用 12 楼 jasonM2008 的回复:]
我也看了用CAsyncSocket写的聊天的例子,那里面也是用的面向连接的,但是那就没这个问题啊 ??我这应该还是有问题啊!
[/Quote]
回复
jasonM2008 2008-04-20
哦!我试一试看!
回复
cnzdgs 2008-04-20
客户端Connect后继续执行,服务端的问题你需要调试来查,看哪里出错。
回复
jasonM2008 2008-04-20
我也看了用CAsyncSocket写的聊天的例子,那里面也是用的面向连接的,但是那就没这个问题啊 ??我这应该还是有问题啊!
回复
jasonM2008 2008-04-20
那怎么办啊,我还是不懂,连接报失败了,服务器也因为连接错误关闭了。杂办????小弟新手还往大哥赐教!!!!
回复
arong1234 2008-04-20
因为异步套接子都不是立刻完成的,完成的真正结果是通过消息通知你的。模型就是这样的。对于所有的异步套接子,WSAEWOULDBLOCK都应该当作正常,所以返回SOCKET_ERROR不代表失败,还必须GetLastError不是WSAEWOULDBLOCK
回复
jasonM2008 2008-04-20
???怎么说是正常的呢 ???
回复
cnzdgs 2008-04-20
10035是正常的,没有错误,非阻塞模式就是这样。
回复
jasonM2008 2008-04-19
改了之后是返回10035错误!
回复
jasonM2008 2008-04-19
CServerSocket 是从CAsyncSocket 派生而来!
回复
arong1234 2008-04-19
而且你给的函数调用都是你CServerSocket的,谁知道你怎么实现的啊
回复
arong1234 2008-04-19
GetLastError必须在发生错误后立刻调用,你再发生错误后先调用Close,错误码就被覆盖成0了
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-19 08:45
社区公告

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