登录站点

用户名

密码

SOCKET的广播通信方法

已有 1053 次阅读  2010-09-30 11:46   标签SOCKET  通信  广播 

SOCKET的广播通信方法

#include
#include
int main()
{
SOCKET s;
WSADATA wsd;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{  
    printf("wsastartup failed ! [%ld]
", WSAGetLastError());  
    return 0;
}

s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)  
{
    printf("create socket failed ! [%ld]
", WSAGetLastError());
    WSACleanup();
    return 0;
}

bool opt = true;
if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char FAR*)&opt, sizeof(opt)) == OCKET_ERROR)  
{  
    printf("setsockopt SO_BROADCAST failed ! [%ld]
", WSAGetLastError());  
    closesocket(s);
    WSACleanup();
    return 0;
}

int nTimeOut = 3000;

if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut, sizeof(nTimeOut) == SOCKET_ERROR))
{  
    printf("setsockopt SO_RCVTIMEO failed ! [%ld]
", WSAGetLastError());  
    closesocket(s);
    WSACleanup();
    return 0;
}

sockaddr_in addr_local, addr_sendto, addr_sender;

addr_local.sin_family = AF_INET;
addr_local.sin_port = htons(0);
addr_local.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (SOCKADDR*)&addr_local, sizeof(addr_local)) == SOCKET_ERROR)
{
    printf("bind() failed ! [%ld]
", WSAGetLastError());
    WSACleanup();
    return 0;
}

addr_sendto.sin_family = AF_INET;
//12345
是服务端接受广播消息的端口号,可自行设定。
addr_sendto.sin_port = htons(12345);
addr_sendto.sin_addr.s_addr = INADDR_BROADCAST;
char szMsg[50] = "";
strcpy(szMsg, "testing testing ...");
for (int i = 0; i < 2; i ++)  
{  
    int nRet = sendto(s, szMsg, 50, 0, (sockaddr*)&addr_sendto, sizeof(addr_sendto));  
    if (nRet == SOCKET_ERROR)
    {
     printf("sendto() failed ! [%ld]
", WSAGetLastError());
     break;
    }
    printf("ok...
");
    char recvbuf[1024] = "";
    DWORD dwLength = 1024;
    int nSenderSize = sizeof(addr_sender);
    int ret = recvfrom(s, recvbuf, dwLength, 0, (SOCKADDR*)&addr_sender, &nSenderSize);
    if (ret == SOCKET_ERROR)
    {
     DWORD dwErr = WSAGetLastError();
     printf("recvfrom() failed ! [%ld]
", dwErr);
     if (dwErr == 10060) //timeout
     {
      continue;
     }
     break;
    }
    else if (ret == 0)
    {
     break;
    }
    else
    {
     recvbuf[ret] = '';
     printf("[%s] sent me: %s
", inet_ntoa(addr_sender.sin_addr), recvbuf);
     break;
    }
   
}

closesocket(s);

WSACleanup();
return 0;
}
  
=========================
局域网中发送广播消息

socket初始化的时候  

地址初始化为 INADDR_BROADCAST ,就是广播了  

例如:  
sock.sin_addr.s_addr  =  htonl  (  INADDR_BROADCAST  );  

 

上一篇: 用skinmagic给VC6开发的软件换肤 下一篇: csdn看到的一个数据封装的例子

分享 举报