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

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);//调用上面的函数!
}
...全文
398 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
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了
加载更多回复(3)

16,467

社区成员

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

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

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