程序思路:创建一个广播SOCKET,绑定好端口,然后创建一个线程循环接收网络上的广播封包,接收到了后判断一下是“a”或者是“b”,如果判断正确的话再发送一个广播回给对方一个信息。 现在问题是:如果对方发送一个广播为“a”,那么我这边会一直不停到“a”,对方关闭了后,我还会收到这个“a”,除非我把程序关了后再开才又正常。
BOOL CUDP_TestDlg::InitSocket()
{
BOOL optval = true;
sock = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(13364);
addr.sin_addr.S_un.S_addr = INADDR_ANY; setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval));
bind(sock,(SOCKADDR *)&addr,sizeof(SOCKADDR));
return TRUE;
}DWORD WINAPI CUDP_TestDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
delete lpParameter;
TCPCFG recv_cfg;
IC_NAME send_cfg;
char tempBuf[500]; int len = sizeof(SOCKADDR);
while(TRUE)
{
memset(tempBuf,0,sizeof(tempBuf));
int result = recvfrom(sock,tempBuf,sizeof(tempBuf),0,(struct sockaddr *)&addrFrom,&len);
if(SOCKET_ERROR == result)
{
result = WSAGetLastError();
TRACE("%d\n",result);
break;
}
else
{
if(tempBuf == "a")
{
TRACE("the data111 recv successful!!!\n");
SendTo((char *)&tempBuf,sizeof(tempBuf),ntohl(inet_addr(pStr)),13364);
}
else
{
if(tempBuf == "b")
{
TRACE("the data222 send successful!!!!!!!\n");
SendTo((char *)&tempBuf,sizeof(tempBuf),ntohl(inet_addr(pStr)),13364);
}
}
}
memset(tempBuf,0,sizeof(tempBuf));
}
return 0;
}BOOL CUDP_TestDlg::SendTo(const char * inBuffer, long inLength,
DWORD inIP, WORD inPort)
{
BOOL optval = true;
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock != INVALID_SOCKET)
{
SOCKADDR_IN addr;
memset((char *) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = INADDR_BROADCAST;
addr.sin_port = htons(inPort);
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval));
int val = sendto(sock, inBuffer, inLength, 0,
(sockaddr *) &addr, sizeof(addr));
if (val == SOCKET_ERROR)
{
TRACE("the data send error!");
return FALSE;
}
else
{
TRACE("the data111 send successful!--%d\n",val);
}
closesocket(sock);
Sleep(60);
return (val != SOCKET_ERROR);
}
return FALSE;
}
BOOL CUDP_TestDlg::InitSocket()
{
BOOL optval = true;
sock = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(13364);
addr.sin_addr.S_un.S_addr = INADDR_ANY; setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval));
bind(sock,(SOCKADDR *)&addr,sizeof(SOCKADDR));
return TRUE;
}DWORD WINAPI CUDP_TestDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
delete lpParameter;
TCPCFG recv_cfg;
IC_NAME send_cfg;
char tempBuf[500]; int len = sizeof(SOCKADDR);
while(TRUE)
{
memset(tempBuf,0,sizeof(tempBuf));
int result = recvfrom(sock,tempBuf,sizeof(tempBuf),0,(struct sockaddr *)&addrFrom,&len);
if(SOCKET_ERROR == result)
{
result = WSAGetLastError();
TRACE("%d\n",result);
break;
}
else
{
if(tempBuf == "a")
{
TRACE("the data111 recv successful!!!\n");
SendTo((char *)&tempBuf,sizeof(tempBuf),ntohl(inet_addr(pStr)),13364);
}
else
{
if(tempBuf == "b")
{
TRACE("the data222 send successful!!!!!!!\n");
SendTo((char *)&tempBuf,sizeof(tempBuf),ntohl(inet_addr(pStr)),13364);
}
}
}
memset(tempBuf,0,sizeof(tempBuf));
}
return 0;
}BOOL CUDP_TestDlg::SendTo(const char * inBuffer, long inLength,
DWORD inIP, WORD inPort)
{
BOOL optval = true;
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock != INVALID_SOCKET)
{
SOCKADDR_IN addr;
memset((char *) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = INADDR_BROADCAST;
addr.sin_port = htons(inPort);
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval));
int val = sendto(sock, inBuffer, inLength, 0,
(sockaddr *) &addr, sizeof(addr));
if (val == SOCKET_ERROR)
{
TRACE("the data send error!");
return FALSE;
}
else
{
TRACE("the data111 send successful!--%d\n",val);
}
closesocket(sock);
Sleep(60);
return (val != SOCKET_ERROR);
}
return FALSE;
}
解决方案 »
- MFC
- mfc 上位机
- CFile.Open(fileName, OpenFlags, CFileException *e);如果出现异常, 会自动throw么? 还是必须自己去判断是否出错,然后throw?
- activex与其他插件冲突,如何解决
- 菜鸟求助!!帮帮忙
- CListCtrl 控件,当view属性为report时,InsertItem(1,"1"),插入时,为什么在1的前面有一个 小方框 ,怎样去掉?
- 在MDI中如何编程关闭一个视图
- 如何使用soft-ICE.
- 新手请注意!我觉着这些内容对于我们新手来说可谓金子(这是别人打的我是觉的写的非常好)
- 如何用图像确定祖玛游戏中小球的滚动方向
- delphi转换为vc的问题?
- ado的_CommandPtr调用存储过程时能不能既得到output值,又得到结果集?
恩,就是这个问题,谢了哦!