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 );
发表评论 评论 (0 个评论)