18,357
社区成员
发帖
与我相关
我的任务
分享 int error = 0;
SockServer = socket(AF_INET, SOCK_DGRAM,0);
addrServer.sin_addr.S_un.S_addr = ::htonl(INADDR_ANY);
addrServer.sin_family = AF_INET;
addrServer.sin_port = ::htons(0);
error = ::bind(SockServer, (SOCKADDR*)&addrServer,sizeof(SOCKADDR));
if(error == SOCKET_ERROR)
{
error = WSAGetLastError();
MessageBox(_T("网络不可用!"));
}
SOCKADDR_IN RecvAddr;
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = ::htons(8801);
RecvAddr.sin_addr.S_un.S_un_b.s_b1 = 255;
RecvAddr.sin_addr.S_un.S_un_b.s_b2 = 255;
RecvAddr.sin_addr.S_un.S_un_b.s_b3 = 255;
RecvAddr.sin_addr.S_un.S_un_b.s_b4 = 255;
char yes = 1;
error = setsockopt(SockServer, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
if(error == SOCKET_ERROR)
{
MessageBox(_T("设置错误!"));
}
error = ::sendto(SockServer,
(char *)&m_senddata,
sizeof(m_senddata),
0,
(SOCKADDR*)&RecvAddr,
sizeof(SOCKADDR));
if(error == SOCKET_ERROR)
{
MessageBox(_T("发送错误"));
return ;
}
//每隔3秒钟向端口号5050不断的发送广播数据
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
BOOL bBroadcast = TRUE;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast));
SOCKADDR_IN bcast;
bcast.sin_family = AF_INET;
bcast.sin_port = htons(5050);
bcast.sin_addr.S_un.s_addr = INADDRY_BROADCAST;
_tprintf(_T("Start send broadcast data...\n"));
char szText[] = "This is broadcast...";
while(TRUE)
{
sendto(s, szText, strlen(szText), 0, (LPSOCKADDR)&bcast, sizeof(bcast));
Sleep(3000);
}
#include <stdio.h>
#include <winsock2.h>
int main()
{
SOCKET s;
WSADATA wsd;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("wsastartup failed ! [%ld]\n", WSAGetLastError());
return 0;
}
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("create socket failed ! [%ld]\n", 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]\n", 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]\n", 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]\n", 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]\n", WSAGetLastError());
break;
}
printf("ok...\n");
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]\n", dwErr);
if (dwErr == 10060) //timeout
{
continue;
}
break;
}
else if (ret == 0)
{
break;
}
else
{
recvbuf[ret] = '\0';
printf("[%s] sent me: %s\n", inet_ntoa(addr_sender.sin_addr), recvbuf);
break;
}
}
closesocket(s);
WSACleanup();
return 0;
}