服务端是异步的 为何客户端 只响应一次 FD_ACCEPT 连接事件呢?
其他接收事件 ,以后再也不响应了呢?
代码如下
客户端端
这里代码是连接不写了。
while(1)
{
char sendBuf[100];
sprintf(sendBuf,"Welcome to Use this");
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
}
服务器是
#define MY_MSG (WM_USER+1000)
ON_MESSAGE(NETWORK_EVENT,OnNetEvent) //这里注册消息
WSADATA wsaData;
//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
MessageBox(_T("初始化网络协议失败!"));
return ;
}
//创建服务器端套接字
ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSock == INVALID_SOCKET)
{
MessageBox(_T("创建套接字失败!"));
closesocket(ServerSock);
WSACleanup();
return ;
}
//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(16000); //端口号不要与其他应用程序冲突
/*localaddr.sin_addr.s_addr = 0;*/
localaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //服务端的IP 127.0.0.1
if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr)) == SOCKET_ERROR)
{
MessageBox(_T("绑定地址失败!"));
closesocket(ServerSock);
WSACleanup();
return ;
}
if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox(_T("注册网络异步事件失败!"));
WSACleanup();
return;
}
listen(ServerSock, 5);
LRESULT CIMServerDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)
{
int iEvent = WSAGETSELECTEVENT(lParam);
SOCKET CurSock= (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: //客户端连接请求事件
OnAccept(CurSock);
break;
case FD_CLOSE: //客户端断开事件:
OnClose(CurSock);
break;
case FD_READ: //网络数据包到达
OnReceive(CurSock);
break;
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0);
OnSend(CurSock);
break;
default: break;
}
return 0;
}
void CIMServerDlg::OnAccept(SOCKET CurSock)
{
//接受连接请求,并保存与发起连接请求的客户端进行通信Socket
//为新的socket注册异步事件,注意没有Accept事件
char sendBuf[100];
sprintf(sendBuf, "Welcome to Use this"); //inet_ntoa(CurSock.sin_addr
//发送
send(CurSock, sendBuf, strlen(sendBuf) + 1, 0);
}
。。。。。 下边函数省略了
9 个解决方案
#1
说的挺迷糊的
看代码应该是客户端不断的向服务器发送信息吧
只响应一次 FD_ACCEPT 连接事件呢? 难道要相应多次?
看代码应该是客户端不断的向服务器发送信息吧
只响应一次 FD_ACCEPT 连接事件呢? 难道要相应多次?
#2
你要问的是不是服务器只响应一次OnAccept啊?
OnAccept是在你客户端Connect时才触发调用的,你连接了一次,它当然只触发一次啦!
从你的代码可以看到的就是,服务器每隔9秒左右,响应一次OnReceive,因为客户端每隔9秒左右发一次数据
OnAccept是在你客户端Connect时才触发调用的,你连接了一次,它当然只触发一次啦!
从你的代码可以看到的就是,服务器每隔9秒左右,响应一次OnReceive,因为客户端每隔9秒左右发一次数据
#3
一个套接字只需要Accept一次
#4
lz想说的应该是OnReceive吧
#5
while(1)
{
char sendBuf[100];
sprintf(sendBuf,"Welcome to Use this");
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
}
你这里只是反复的发送而已,并没有反复的连接。反复的发送只会导致FD_READ,不会导致FD_ACCEPT,connect才会导致FD_ACCEPT。
{
char sendBuf[100];
sprintf(sendBuf,"Welcome to Use this");
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
}
你这里只是反复的发送而已,并没有反复的连接。反复的发送只会导致FD_READ,不会导致FD_ACCEPT,connect才会导致FD_ACCEPT。
#6
FD_READ
#7
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0);
OnSend(CurSock);
break;
怎么这里也recv,然后send呀?
recv(CurSock, recvBuf, 100, 0);
OnSend(CurSock);
break;
怎么这里也recv,然后send呀?
#8
消息处理,第一步应该是先判断消息参数,是否有错
if(WSAGETSELECTERROR(lParam))
{
closesocket(lParam);
break;
}
, 没错的话才进入下一步处理
我估计你的socket第二次进来就在错误里去了,
if(WSAGETSELECTERROR(lParam))
{
closesocket(lParam);
break;
}
, 没错的话才进入下一步处理
我估计你的socket第二次进来就在错误里去了,
#9
楼上那么多人没看清楚楼主意思,楼主的意思只响应了一次 FD_Accept,其他操作没响应
还有种可能是楼主的代码在
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0); // 这里应该是发送
OnSend(CurSock);
break;
这里发生了错误, 第一次Connect 或者accept 成功是会触发的 Fd_write的
还有种可能是楼主的代码在
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0); // 这里应该是发送
OnSend(CurSock);
break;
这里发生了错误, 第一次Connect 或者accept 成功是会触发的 Fd_write的
#1
说的挺迷糊的
看代码应该是客户端不断的向服务器发送信息吧
只响应一次 FD_ACCEPT 连接事件呢? 难道要相应多次?
看代码应该是客户端不断的向服务器发送信息吧
只响应一次 FD_ACCEPT 连接事件呢? 难道要相应多次?
#2
你要问的是不是服务器只响应一次OnAccept啊?
OnAccept是在你客户端Connect时才触发调用的,你连接了一次,它当然只触发一次啦!
从你的代码可以看到的就是,服务器每隔9秒左右,响应一次OnReceive,因为客户端每隔9秒左右发一次数据
OnAccept是在你客户端Connect时才触发调用的,你连接了一次,它当然只触发一次啦!
从你的代码可以看到的就是,服务器每隔9秒左右,响应一次OnReceive,因为客户端每隔9秒左右发一次数据
#3
一个套接字只需要Accept一次
#4
lz想说的应该是OnReceive吧
#5
while(1)
{
char sendBuf[100];
sprintf(sendBuf,"Welcome to Use this");
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
}
你这里只是反复的发送而已,并没有反复的连接。反复的发送只会导致FD_READ,不会导致FD_ACCEPT,connect才会导致FD_ACCEPT。
{
char sendBuf[100];
sprintf(sendBuf,"Welcome to Use this");
int ret = send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
Sleep(9000); 每隔9秒发一次
}
你这里只是反复的发送而已,并没有反复的连接。反复的发送只会导致FD_READ,不会导致FD_ACCEPT,connect才会导致FD_ACCEPT。
#6
FD_READ
#7
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0);
OnSend(CurSock);
break;
怎么这里也recv,然后send呀?
recv(CurSock, recvBuf, 100, 0);
OnSend(CurSock);
break;
怎么这里也recv,然后send呀?
#8
消息处理,第一步应该是先判断消息参数,是否有错
if(WSAGETSELECTERROR(lParam))
{
closesocket(lParam);
break;
}
, 没错的话才进入下一步处理
我估计你的socket第二次进来就在错误里去了,
if(WSAGETSELECTERROR(lParam))
{
closesocket(lParam);
break;
}
, 没错的话才进入下一步处理
我估计你的socket第二次进来就在错误里去了,
#9
楼上那么多人没看清楚楼主意思,楼主的意思只响应了一次 FD_Accept,其他操作没响应
还有种可能是楼主的代码在
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0); // 这里应该是发送
OnSend(CurSock);
break;
这里发生了错误, 第一次Connect 或者accept 成功是会触发的 Fd_write的
还有种可能是楼主的代码在
case FD_WRITE: //发送网络数据事件
recv(CurSock, recvBuf, 100, 0); // 这里应该是发送
OnSend(CurSock);
break;
这里发生了错误, 第一次Connect 或者accept 成功是会触发的 Fd_write的