用CAysncSocket 实现UDP通信,
Client端:
初始化:
sockClient.Create(atoi(m_strPort2),SOCK_DGRAM);
发送:
char *pbuf[1024];
*pbuf=(LPSTR)(LPCTSTR)str;
char *pAddress[100];
*pAddress=(LPSTR)(LPCTSTR)address; if (SOCKET_ERROR==SendTo(*pbuf,1024,atoi(port),*pAddress,0))
{
showActionMsg("发送失败 ");
return false;
}
//显时IP和端口
showSendMsg("IP地址: "+address+" 端口: "+port);
接收:
void CBCSock::OnReceive(int nErrorCode)
{
//得到客户A的地址和端口
CString rPeerAddress;
UINT rPeerPort;; showActionMsg("进入CBCSock::OnReceive()"); char buff[1024];
memset(buff,0,sizeof(buff));
int nRead;
nRead = ReceiveFrom(buff, sizeof(buff),rPeerAddress,rPeerPort,0); char temp[10];
itoa(nRead,temp,10);
showActionMsg(temp);
switch (nRead)
{
case 0:
showActionMsg("收到零个字符");
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
showActionMsg ("读取数据时产生错误");
Close();
}
break;
default:
buff[nRead] ='\0'; //terminate the string
}
itoa(rPeerPort,temp,10);
showActionMsg("IP地址: "+rPeerAddress+" 端口: "+temp);
showRecieveMsg(buff);
showRecieveMsg("IP地址: "+rPeerAddress+" 端口: "+temp+" : "); CAsyncSocket::OnReceive(nErrorCode);
}Server端:
初始化:
if (!sockServer.Create(atol(m_strPort),SOCK_DGRAM)) //绑定此端口
{
m_listAction.InsertString(0,"创建接收套接字出现错误!");
}
else
{
m_listAction.InsertString(0,"创建接收套接字成功"); //插入列表框中
}
接收:
void CBCSock::OnReceive(int nErrorCode)
{
//得到客户A的地址和端口
CString rPeerAddress;
UINT rPeerPort;; Sleep(100);
char buff[1024];
memset(buff,0,sizeof(buff));
int nRead;
nRead = ReceiveFrom(buff,sizeof(buff),rPeerAddress,rPeerPort); char temp[10];
itoa(nRead,temp,10);
showActionMsg(temp);
long L=-1;
switch (nRead)
{
case 0:
showActionMsg("收到零个字符");
Close();
break;
case SOCKET_ERROR:
L=GetLastError();
if (L != WSAEWOULDBLOCK)
{
char __temp[200];
itoa(l,__temp,10);
CString __str=__temp;
showActionMsg ("读取数据时产生错误,代码: "+__str);
Close();
}
break;
default:
showActionMsg("读取到数据");
buff[nRead] ='\0'; //terminate the string
itoa(rPeerPort,temp,10);
} CAsyncSocket::OnReceive(nErrorCode);
}
发送:
bool CBCSock::SendMSG(CString str,CString address,CString port,CString strName)
{
char *pbuf[1024];
*pbuf=(LPSTR)(LPCTSTR)str;
char *pAddress[100];
*pAddress=(LPSTR)(LPCTSTR)address; if (SOCKET_ERROR==SendTo(*pbuf,1024,atoi(port),*pAddress,0))
{
showActionMsg("发送失败 ");
return false;
}
在同一台计算机上或同一个局域网内,client与server通信,很正常,
把sever放在一个公网IP上,与局域网内或是公网上通信,刚开始server收发数据很正常,
如果停止收发(程序都不退出),大概几十秒后,server向客户端发数据时,出现错误
却进入了OnRecieve函数(为什么?),执行这段代码:
case SOCKET_ERROR:
L=GetLastError();
if (l != WSAEWOULDBLOCK)
{
char __temp[200];
itoa(l,__temp,10);
CString __str=__temp;
showActionMsg ("读取数据时产生错误,代码: "+__str);
Close();
}
break;
得到的错误代码为:0(即L);刚开始回传正常,双方停止一段时间,之后client不先发信息,server先向client发,出现上述错误,
请高手指点!
谢谢
Client端:
初始化:
sockClient.Create(atoi(m_strPort2),SOCK_DGRAM);
发送:
char *pbuf[1024];
*pbuf=(LPSTR)(LPCTSTR)str;
char *pAddress[100];
*pAddress=(LPSTR)(LPCTSTR)address; if (SOCKET_ERROR==SendTo(*pbuf,1024,atoi(port),*pAddress,0))
{
showActionMsg("发送失败 ");
return false;
}
//显时IP和端口
showSendMsg("IP地址: "+address+" 端口: "+port);
接收:
void CBCSock::OnReceive(int nErrorCode)
{
//得到客户A的地址和端口
CString rPeerAddress;
UINT rPeerPort;; showActionMsg("进入CBCSock::OnReceive()"); char buff[1024];
memset(buff,0,sizeof(buff));
int nRead;
nRead = ReceiveFrom(buff, sizeof(buff),rPeerAddress,rPeerPort,0); char temp[10];
itoa(nRead,temp,10);
showActionMsg(temp);
switch (nRead)
{
case 0:
showActionMsg("收到零个字符");
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
showActionMsg ("读取数据时产生错误");
Close();
}
break;
default:
buff[nRead] ='\0'; //terminate the string
}
itoa(rPeerPort,temp,10);
showActionMsg("IP地址: "+rPeerAddress+" 端口: "+temp);
showRecieveMsg(buff);
showRecieveMsg("IP地址: "+rPeerAddress+" 端口: "+temp+" : "); CAsyncSocket::OnReceive(nErrorCode);
}Server端:
初始化:
if (!sockServer.Create(atol(m_strPort),SOCK_DGRAM)) //绑定此端口
{
m_listAction.InsertString(0,"创建接收套接字出现错误!");
}
else
{
m_listAction.InsertString(0,"创建接收套接字成功"); //插入列表框中
}
接收:
void CBCSock::OnReceive(int nErrorCode)
{
//得到客户A的地址和端口
CString rPeerAddress;
UINT rPeerPort;; Sleep(100);
char buff[1024];
memset(buff,0,sizeof(buff));
int nRead;
nRead = ReceiveFrom(buff,sizeof(buff),rPeerAddress,rPeerPort); char temp[10];
itoa(nRead,temp,10);
showActionMsg(temp);
long L=-1;
switch (nRead)
{
case 0:
showActionMsg("收到零个字符");
Close();
break;
case SOCKET_ERROR:
L=GetLastError();
if (L != WSAEWOULDBLOCK)
{
char __temp[200];
itoa(l,__temp,10);
CString __str=__temp;
showActionMsg ("读取数据时产生错误,代码: "+__str);
Close();
}
break;
default:
showActionMsg("读取到数据");
buff[nRead] ='\0'; //terminate the string
itoa(rPeerPort,temp,10);
} CAsyncSocket::OnReceive(nErrorCode);
}
发送:
bool CBCSock::SendMSG(CString str,CString address,CString port,CString strName)
{
char *pbuf[1024];
*pbuf=(LPSTR)(LPCTSTR)str;
char *pAddress[100];
*pAddress=(LPSTR)(LPCTSTR)address; if (SOCKET_ERROR==SendTo(*pbuf,1024,atoi(port),*pAddress,0))
{
showActionMsg("发送失败 ");
return false;
}
在同一台计算机上或同一个局域网内,client与server通信,很正常,
把sever放在一个公网IP上,与局域网内或是公网上通信,刚开始server收发数据很正常,
如果停止收发(程序都不退出),大概几十秒后,server向客户端发数据时,出现错误
却进入了OnRecieve函数(为什么?),执行这段代码:
case SOCKET_ERROR:
L=GetLastError();
if (l != WSAEWOULDBLOCK)
{
char __temp[200];
itoa(l,__temp,10);
CString __str=__temp;
showActionMsg ("读取数据时产生错误,代码: "+__str);
Close();
}
break;
得到的错误代码为:0(即L);刚开始回传正常,双方停止一段时间,之后client不先发信息,server先向client发,出现上述错误,
请高手指点!
谢谢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货