accept的时候返回的错误!!

wangsiyuanoo 2009-08-06 04:20:24
首先,客户端连接服务器是成功了的!
然后,客户端发送消息给服务器。
但服务器在accept的时候返回10022错误。

服务器代码如下:

//“启动服务器”按钮
void CServerDlg::OnBnClickedBeginButton()
{
UpdateData();

StartListen(); //创建服务器套接字,设置成非阻塞模式,绑定端口号,侦听连接。

m_AcceptRecv_Thread =(HANDLE)_beginthreadex( NULL, 0, AcceptRecv , this, 0, &m_AcceptRecv_ThreadId );
if( NULL == m_AcceptRecv_Thread )
return;

UpdateData(FALSE);
}

unsigned __stdcall CServerDlg::AcceptRecv( void * obj )
{
CServerDlg *pDlg = (CServerDlg*)obj;
if( NULL == pDlg)
return -1;

while(true)
pDlg->AcceptRecv();

return 0;
}

void CServerDlg::AcceptRecv()
{
//当数据可读时,表示有新的连接请求
if( !CanRead() )
return;

//同意客户端的连接
SOCKET TempSocket = accept(m_ServerSocket, NULL, NULL);
if(INVALID_SOCKET == TempSocket || NULL == TempSocket)
{
CString strError = GetErrorInfo(); //当客户端向服务器发送消息的时候,返回10022错误!
MessageBox(strError);

KillTimer(WAIT_CONNECT);
return;
}
else
{
m_EC_strStatus += "\r\n客户端连接服务器 成功!\r\n";
m_ServerSocket = TempSocket;
RecvMsg(); //接受数据
}
}

void CServerDlg::RecvMsg()
{
char RecvMsgBuf[1024] = {0};
if(SOCKET_ERROR != recv(m_ServerSocket, RecvMsgBuf, 1024, 0)) //接受客户端传来的数据
m_EC_strRecvMsg = RecvMsgBuf;
}
...全文
835 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai2000 2009-08-12
  • 打赏
  • 举报
回复
服务器端代码有错误。
m_ServerSocket = TempSocket;
不应改变监听socket
wangsiyuanoo 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bohut 的回复:]
客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
[/Quote]
想问的是,是不是每次send()之前,都要socket(),connect()呢?
我程序如果只socket(),connect()一次,但send()多次的时候,只有第一次是可以发送成功的。再点发送
就不行了。
bohut 2009-08-06
  • 打赏
  • 举报
回复
Server端的程序参考一下:
http://www.host01.com/article/software/cc/20060917232900637.htm
bohut 2009-08-06
  • 打赏
  • 举报
回复
客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
wangsiyuanoo 2009-08-06
  • 打赏
  • 举报
回复
是服务器接受那出了问题

服务器代码:
void CServerDlg::Accept()
{
//当数据可读时,表示有新的连接请求
if( CanRead() )
{
//同意客户端的连接
SOCKET TempSocket = accept(m_ServerSocket, NULL, NULL);
if(INVALID_SOCKET == TempSocket || NULL == TempSocket)
{
CString strError = GetErrorInfo();
MessageBox(strError);

KillTimer(WAIT_CONNECT);
return;
}
else
{
m_EC_strStatus += "\r\n客户端连接服务器 成功!\r\n";
m_ServerSocket = TempSocket;
RecvMsg();
}
}
}

bool CServerDlg::CanRead()
{
fd_set readfds;
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(m_ServerSocket, &readfds);
int ret = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout);
if(ret > 0 && FD_ISSET(m_ServerSocket, &readfds))
return true; //第一次发送的时候是true
else
return false; //但下面在发送的时候,就是false了
}


客户端我设置的是发送一次就先创建一个套接字,然后连接,最后发送。

请问是哪里的错呢
dengxuxing 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangsiyuanoo 的回复:]
是不是
每次发送条消息
都要先创建一个套接字,然后连接,最后发送。。。
缺一不可。。。
[/Quote]
不是的,创建连接之后,你发多少次都不用再创建连接了,除非与服务器断开了连接
wangsiyuanoo 2009-08-06
  • 打赏
  • 举报
回复
是不是
每次发送条消息
都要先创建一个套接字,然后连接,最后发送。。。
缺一不可。。。
bohut 2009-08-06
  • 打赏
  • 举报
回复
关键是“长连接”还是“短连接”
长连只需要连一次,但需要心跳包维持链路
短连是每次发的时候才连,发完断开链路
wangsiyuanoo 2009-08-06
  • 打赏
  • 举报
回复
我在客户端上做了一下修改
原来是一个初始化函数里包含了:创建客户端套接字和connect
现在把connect函数放在了send函数里。
也就是说,一个按钮负责初始化,一个按钮负责连接和发送。
发送成功。
但再次发送的时候,客户端就会报10056错误:在一个已经连接的套接字上做了一个连接请求。

是不是我逻辑上有问题。
我现在糊涂了
到底是创建的时候连接一下服务器,以后就不要再连接了
还是每次发送的时候都要连接一下服务器

可这两种情况我都试过了,第一种是发都发不出去的,第二种是只能发成功一下。
chinezwq 2009-08-06
  • 打赏
  • 举报
回复
应该没有connect成功吧,你看看你流程是否正确。
bohut 2009-08-06
  • 打赏
  • 举报
回复
看一下你StartListen()的函数具体的代码
wangsiyuanoo 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bohut 的回复:]
如果套接口尚未绑定或绑定了INADDR_ANY地址但尚未未调用connect函数,那么accept函数将返回10022错误
[/Quote]
服务器已经绑定127.0.0.1地址,和34567端口号
如果在客户端发送消息之前再调用一下connect函数,客户端又会报错:10056.
socoola 2009-08-06
  • 打赏
  • 举报
回复
10022错误说明你的参数错误
bohut 2009-08-06
  • 打赏
  • 举报
回复
如果套接口尚未绑定或绑定了INADDR_ANY地址但尚未未调用connect函数,那么accept函数将返回10022错误

18,363

社区成员

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

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