代码如下:(摘抄于网络)
//  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);
}
希望哪位朋友帮忙看看,多谢拉

解决方案 »

  1.   

    谢谢,
    比方说,我用Recv.exe来接收时,可以得到所有Send源的
                IP地址
                和
                发出的广播信息“TEST MESSAGE”
      

  2.   

    比如说,
    我在 A/B/C/D几台PC上使用Send.exe不停地进行广播发送数据,在E这台PC上用recv.exe来接收ABCD的IP地址/MAC/计算机名称/信息内容(TEST MESSAGE)
      

  3.   

    现在,我用send.exe不停地UDP广播,另外,使用WireShark来接收UDP信息,起码可以在source位置看到所有在线的IP地址,但是,用recv.exe却什么也不能发现,当然,除了255.255.255.255之外
      

  4.   

    我写的发送多播包的程序,你可以看看://server
    #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;
    }
      

  5.   

    //然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
        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 是用来接收的 不用赋值
      

  6.   

    a.sin_addr.s_addr=INADDR_BROADCAST;
    试试绑定你接收端的IP
      

  7.   


    我又仔细看了看你的要求, 你是要在recv端得到send端的信息,
    IP地址你像你的代码那样可以得到, 再根据IP地址,去取得
    其它信息。你的程序可以收到来自己不同机器的的数据包,你所说的
    只得255.255.255.255的包,是目的IP地址, 这个IP地址是广播
    IP地址。 
      

  8.   

    //从广播地址发送消息
            int ret=sendto(s,smsg,256,0,(sockaddr*)&addrto,nlen);
    -->
    //从广播地址发送消息
            int ret=sendto(s,smsg,strlen(smg),0,(sockaddr*)&addrto,nlen);