想法是先测试可以发数据否?可以就发代码如下,其中m_Socket.m_RemoteSocket是全局SOCKET,并已建立连接,接收端没问题:
void Send()
{
char buff[]="test";
int nResult=0,Event=0,Index=0;
extern WSSocket m_Socket;
WSAEVENT wsaEvent[2],NewEvent;
SOCKET Socket[2];
WSANETWORKEVENTS NetworkEvents;
if(m_Socket.m_RemoteSocket==INVALID_SOCKET){
AfxMessageBox("客户端未建立连接");
return;
}
send(m_Socket.m_RemoteSocket,buff,sizeof(buff),0);
NewEvent=WSACreateEvent();
if(NewEvent==WSA_INVALID_EVENT){
AfxMessageBox("事件创建失败");
return;
}
if(WSAEventSelect(m_Socket.m_RemoteSocket,NewEvent,FD_WRITE)==SOCKET_ERROR){
AfxMessageBox(m_Socket.ProcessError(GetLastError()));
return;
}
Socket[Event]=m_Socket.m_RemoteSocket;
wsaEvent[Event]=NewEvent;
for(int i=0;i<3;i++){
//first wait for event for infinite
Index=WSAWaitForMultipleEvents(1,wsaEvent,FALSE,500,FALSE);
if(Index==WSA_WAIT_TIMEOUT)
continue;
WSAEnumNetworkEvents(Socket[Index-WSA_WAIT_EVENT_0],wsaEvent[Index-WSA_WAIT_EVENT_0],&NetworkEvents);
//at server only want to process accept read event
TRACE0("write data\n");
if(NetworkEvents.lNetworkEvents & FD_WRITE){
if(NetworkEvents.iErrorCode[FD_WRITE_BIT]!=0){
AfxMessageBox("FD_WRITE出错,"+m_Socket.ProcessError(NetworkEvents.iErrorCode[FD_ACCEPT_BIT]));
break;
}
TRACE0("data is writing\n");
nResult=send(Socket[Index-WSA_WAIT_EVENT_0],buff,sizeof(buff),0);
if(nResult==SOCKET_ERROR){
AfxMessageBox(ProcessError(WSAGetLastError()));
}
else{
break;
}
}//end fd_write
}//end for
if(Index==WSA_WAIT_TIMEOUT&&i==3){
AfxMessageBox("网络超时,发送不成功");
}
WSACloseEvent(wsaEvent[Event]);
WSACloseEvent(NewEvent);
}
void Send()
{
char buff[]="test";
int nResult=0,Event=0,Index=0;
extern WSSocket m_Socket;
WSAEVENT wsaEvent[2],NewEvent;
SOCKET Socket[2];
WSANETWORKEVENTS NetworkEvents;
if(m_Socket.m_RemoteSocket==INVALID_SOCKET){
AfxMessageBox("客户端未建立连接");
return;
}
send(m_Socket.m_RemoteSocket,buff,sizeof(buff),0);
NewEvent=WSACreateEvent();
if(NewEvent==WSA_INVALID_EVENT){
AfxMessageBox("事件创建失败");
return;
}
if(WSAEventSelect(m_Socket.m_RemoteSocket,NewEvent,FD_WRITE)==SOCKET_ERROR){
AfxMessageBox(m_Socket.ProcessError(GetLastError()));
return;
}
Socket[Event]=m_Socket.m_RemoteSocket;
wsaEvent[Event]=NewEvent;
for(int i=0;i<3;i++){
//first wait for event for infinite
Index=WSAWaitForMultipleEvents(1,wsaEvent,FALSE,500,FALSE);
if(Index==WSA_WAIT_TIMEOUT)
continue;
WSAEnumNetworkEvents(Socket[Index-WSA_WAIT_EVENT_0],wsaEvent[Index-WSA_WAIT_EVENT_0],&NetworkEvents);
//at server only want to process accept read event
TRACE0("write data\n");
if(NetworkEvents.lNetworkEvents & FD_WRITE){
if(NetworkEvents.iErrorCode[FD_WRITE_BIT]!=0){
AfxMessageBox("FD_WRITE出错,"+m_Socket.ProcessError(NetworkEvents.iErrorCode[FD_ACCEPT_BIT]));
break;
}
TRACE0("data is writing\n");
nResult=send(Socket[Index-WSA_WAIT_EVENT_0],buff,sizeof(buff),0);
if(nResult==SOCKET_ERROR){
AfxMessageBox(ProcessError(WSAGetLastError()));
}
else{
break;
}
}//end fd_write
}//end for
if(Index==WSA_WAIT_TIMEOUT&&i==3){
AfxMessageBox("网络超时,发送不成功");
}
WSACloseEvent(wsaEvent[Event]);
WSACloseEvent(NewEvent);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货