代码如下:(摘抄于网络)
// SEND Segment
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>#pragma comment(lib,"ws2_32.lib")
void main(void)
{
SOCKET s;
sockaddr_in addrto;
WSADATA wsdata;
BOOL bsocket;
char *smsg="TEST MESSAGE";
WSAStartup(0x0202,&wsdata);
s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
bsocket=TRUE;
//然后赋值给地址,用来从网络上的广播地址接收消息;
addrto.sin_family=AF_INET;
addrto.sin_addr.s_addr=INADDR_BROADCAST;
addrto.sin_port=htons(5050);
bool opt=true;
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));
int nlen=sizeof(addrto);
while(1)
{
Sleep(1000);
//从广播地址发送消息
int ret=sendto(s,smsg,256,0,(sockaddr*)&addrto,nlen);
if(ret==SOCKET_ERROR)
{
printf("GetLastError: %d",WSAGetLastError());
}
else
{
printf("ok");
}
}
}-----------------------------------------------------------// Recv segment
void main(void)
{
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;
//启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);
optval=TRUE;
//然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050); from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);
int fromlength=sizeof(SOCKADDR);
s=socket(AF_INET,SOCK_DGRAM,0);
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256];
while(1)
{//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
Sleep(2000);
printf("%s\r\n",inet_ntoa(from.sin_addr)); //在此处输出检查到的IP,对吗????
ZeroMemory(buf,256);
}
希望哪位朋友帮忙看看,多谢拉
// SEND Segment
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>#pragma comment(lib,"ws2_32.lib")
void main(void)
{
SOCKET s;
sockaddr_in addrto;
WSADATA wsdata;
BOOL bsocket;
char *smsg="TEST MESSAGE";
WSAStartup(0x0202,&wsdata);
s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
bsocket=TRUE;
//然后赋值给地址,用来从网络上的广播地址接收消息;
addrto.sin_family=AF_INET;
addrto.sin_addr.s_addr=INADDR_BROADCAST;
addrto.sin_port=htons(5050);
bool opt=true;
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));
int nlen=sizeof(addrto);
while(1)
{
Sleep(1000);
//从广播地址发送消息
int ret=sendto(s,smsg,256,0,(sockaddr*)&addrto,nlen);
if(ret==SOCKET_ERROR)
{
printf("GetLastError: %d",WSAGetLastError());
}
else
{
printf("ok");
}
}
}-----------------------------------------------------------// Recv segment
void main(void)
{
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;
//启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);
optval=TRUE;
//然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050); from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);
int fromlength=sizeof(SOCKADDR);
s=socket(AF_INET,SOCK_DGRAM,0);
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256];
while(1)
{//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
Sleep(2000);
printf("%s\r\n",inet_ntoa(from.sin_addr)); //在此处输出检查到的IP,对吗????
ZeroMemory(buf,256);
}
希望哪位朋友帮忙看看,多谢拉
解决方案 »
- VC初学者求前辈进来解惑!!
- 谢谢!!!socket和RPC的问题!
- MFCO42D.DLL出错的问题
- 厚着脸皮求。谁能帮我做个简单的例子,不甚感激。倾家荡产啊。
- 搞不懂c++
- 字符串的问题,请大师指教
- 如何实现坐标缩放?请高手指教!
- 关于activeX的开布,这个activeX调用了N个dll,这些DLL又分调用了很多资源
- 询问:怎样读取文件中指定行的内容?
- pIUnknown->QueryInterface(const IID& iid, void** ppv)中第一参数如何理解
- 今天用Windows7 64位的系统,在VC6下编译以前的一个程序,结果在其它XP的机器上运行不了了?各位大侠进来一下呀
- 关于http请求中Accept-Encoding: gzip, deflate
比方说,我用Recv.exe来接收时,可以得到所有Send源的
IP地址
和
发出的广播信息“TEST MESSAGE”
我在 A/B/C/D几台PC上使用Send.exe不停地进行广播发送数据,在E这台PC上用recv.exe来接收ABCD的IP地址/MAC/计算机名称/信息内容(TEST MESSAGE)
#include "stdafx.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#include "windows.h"#define MULTICAST_ADDR "224.10.10.88"
#define MULTICAST_PORT 6000
#define LOCAL_PORT 8000
int _tmain(int argc, _TCHAR* argv[])
{
WSAData wdata;
SOCKET s,sm;
char buf[100];
SOCKADDR_IN localaddr,removeaddr;
int opval,iport = MULTICAST_PORT;
if(WSAStartup(MAKEWORD(2,2), &wdata) != 0) {
printf("error:can not support winsocket 2\r\n");
return 0;
} s = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_MULTIPOINT_C_LEAF);
if(s == INVALID_SOCKET) {
printf("create socket failed\r\n");
closesocket(s);
WSACleanup();
return 0;
} localaddr.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1");
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(LOCAL_PORT);
if(bind(s, (SOCKADDR *)&localaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR){
printf("bind error\r\n");
closesocket(s);
WSACleanup();
return 0;
} opval = 8;
if(setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&opval, sizeof(int)) == SOCKET_ERROR) {
printf("setsockopt error\r\n");
closesocket(s);
WSACleanup();
return 0;
} removeaddr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR);
removeaddr.sin_family = AF_INET;
removeaddr.sin_port = htons(iport);
sm = WSAJoinLeaf(s,(SOCKADDR*)&removeaddr,sizeof(SOCKADDR_IN), NULL, NULL, NULL, NULL, JL_BOTH);
if(sm == INVALID_SOCKET) {
printf("WSAJoinLeaf error\r\n");
closesocket(s);
WSACleanup();
return 0;
} while(1) {
GetTimeFormat(NULL, 0, NULL, NULL, (LPTSTR)buf, 100);
if(sendto(sm, buf, strlen(buf), 0, (SOCKADDR*)&removeaddr, sizeof(SOCKADDR)) == SOCKET_ERROR ) {
printf("send data error\r\n");
closesocket(sm);
closesocket(s);
WSACleanup();
return 0;
}
printf("%s\r\n",buf);
Sleep(1000);
}
return 0;
}///////////////////////client
#include "stdafx.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#include "windows.h"#define MULTICAST_ADDR "224.10.10.88"
#define MULTICAST_PORT 6001
#define LOCAL_PORT 6000int _tmain(int argc, _TCHAR* argv[])
{
WSAData wdata;
SOCKET s,sm;
char buf[100];
SOCKADDR_IN localaddr,removeaddr;
int opval,iport = MULTICAST_PORT; if(WSAStartup(MAKEWORD(2,2), &wdata) != 0) {
printf("error:can not support winsocket 2\r\n");
return 0;
} s = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_MULTIPOINT_C_LEAF);
if(s == INVALID_SOCKET) {
printf("create socket failed\r\n");
closesocket(s);
WSACleanup();
return 0;
} localaddr.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1");
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(LOCAL_PORT);
if(bind(s, (SOCKADDR *)&localaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR){
printf("bind error\r\n");
closesocket(s);
WSACleanup();
return 0;
} opval = 8;
if(setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&opval, sizeof(int)) == SOCKET_ERROR) {
printf("setsockopt error\r\n");
closesocket(s);
WSACleanup();
return 0;
} removeaddr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR);
removeaddr.sin_family = AF_INET;
removeaddr.sin_port = htons(iport);
sm = WSAJoinLeaf(s,(SOCKADDR*)&removeaddr,sizeof(SOCKADDR_IN), NULL, NULL, NULL, NULL, JL_BOTH);
if(sm == INVALID_SOCKET) {
printf("WSAJoinLeaf error\r\n");
closesocket(s);
WSACleanup();
return 0;
} while(1) {
memset(buf, 0, 100);
opval = sizeof(SOCKADDR);
memset(&removeaddr, 0, sizeof(SOCKADDR_IN));
if(recvfrom(sm, buf, 100, 0, (SOCKADDR*)&removeaddr, &opval) == SOCKET_ERROR ) {
printf("send data error\r\n");
closesocket(sm);
closesocket(s);
WSACleanup();
return 0;
}
printf("%s\r\n",buf);
}
closesocket(sm);
closesocket(s);
WSACleanup();
return 0;
}
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050); from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);变成
a.sin_family=AF_INET;
a.sin_addr.s_addr=INADDR_BROADCAST;
a.sin_port=htons(5050);
from 是用来接收的 不用赋值
试试绑定你接收端的IP
我又仔细看了看你的要求, 你是要在recv端得到send端的信息,
IP地址你像你的代码那样可以得到, 再根据IP地址,去取得
其它信息。你的程序可以收到来自己不同机器的的数据包,你所说的
只得255.255.255.255的包,是目的IP地址, 这个IP地址是广播
IP地址。
int ret=sendto(s,smsg,256,0,(sockaddr*)&addrto,nlen);
-->
//从广播地址发送消息
int ret=sendto(s,smsg,strlen(smg),0,(sockaddr*)&addrto,nlen);