首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

为什么这段代码得不到小弟我想要的结果?(UDP广播通讯)

2012-06-01 
为什么这段代码得不到我想要的结果?(UDP广播通讯)代码如下:(摘抄于网络)C/C++ code//SEND Segment#include

为什么这段代码得不到我想要的结果?(UDP广播通讯)
代码如下:(摘抄于网络)

C/C++ code
//  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 segmentvoid 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);    }


希望哪位朋友帮忙看看,多谢拉

[解决办法]
你接收不了数据吗,代码看上去没有问题呀, 检查IP的地方也是对的
[解决办法]
我写的发送多播包的程序,你可以看看:
C/C++ code
//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     8000int _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 是用来接收的 不用赋值
[解决办法]

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

[解决办法]
a.sin_addr.s_addr=INADDR_BROADCAST;
试试绑定你接收端的IP

热点排行