广播实验

以下代码测试通过,可以在win10,xp之间发送和收听广播。不过要注意端口在win10下可能被占用,就要换个端口。广播好像和端口有关的。端口不一样,是无法收听到的。
发送端代码

// 广播发送端.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include<stdlib.h>
//#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>

#pragma comment (lib, "ws2_32.lib")
int main()
{
    SOCKET s;
    sockaddr_in addrto;
    WSADATA wsdata;
    BOOL bsocket;
    char *smsg = "this is a test wyj\0";

    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(5051);
    bool opt = true;

    setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof (opt));


    //多网卡要指定在哪个上发
    /*
    sockaddr_in   m_saUdpCli;
    m_saUdpCli.sin_family = AF_INET;
    m_saUdpCli.sin_addr.s_addr = inet_addr("192.168.0.91");//这个IP就是我选择要发送广播包的网卡的IP
    m_saUdpCli.sin_port = htons(1003);
    int nResult = bind(s,(SOCKADDR *)&m_saUdpCli,sizeof(SOCKADDR_IN));
    */


    int nlen = sizeof (addrto);
    while (1)
    {
        Sleep(1000);

        int ret = sendto(s,smsg,strlen(smsg),0,(sockaddr*)&addrto,nlen);
        if (ret == SOCKET_ERROR)
            printf("Error:%s\n",WSAGetLastError());
        else
        {
            printf("ok");
        }
    }

    return -1;
}

接收端代码

// 广播接收.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdlib.h>
//#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock2.h>
#include<windows.h>

#include <iostream>

#include <Ws2tcpip.h>
#include <process.h> //_beginthread要求

#pragma comment(lib, "ws2_32.lib")

using namespace std;
#pragma comment (lib, "ws2_32.lib")

void main(void)
{
    SOCKET s;
    sockaddr_in from,a;
    WSADATA wsdata;
    BOOL optval;

    WSAStartup(0x0202,&wsdata);
    optval = TRUE;

    a.sin_family = AF_INET;
    a.sin_addr.s_addr = 0;
    a.sin_port = htons(5051);


    int fromlength = sizeof (SOCKADDR);

    s = socket(AF_INET,SOCK_DGRAM,0);

    setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof (optval));
    //多网卡要指定在哪个上发
    /*
    sockaddr_in   m_saUdpCli;
    m_saUdpCli.sin_family = AF_INET;
    m_saUdpCli.sin_addr.s_addr = inet_addr("192.168.0.91");//这个IP就是我选择要发送广播包的网卡的IP
    m_saUdpCli.sin_port = htons(1003);
    int nResult = bind(s,(SOCKADDR *)&m_saUdpCli,sizeof(SOCKADDR_IN));*/
    const int loopback = 1; //
    int ret = setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,\
        (char*)&loopback,sizeof(loopback));
    if (ret == SOCKET_ERROR)
    {
        WSACleanup();

        cout << "Error in setsockopt(IP_MULTICAST_LOOP): " << WSAGetLastError() << endl;

    }
    bind(s,(sockaddr *)&a,sizeof(sockaddr_in));

    if (WSAGetLastError() == WSAEADDRINUSE)
    {
        printf("端口已被占用\n");
    }




    char buf[256];
    memset(buf,0,256);
    while (1)
    { 
        recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
        Sleep(2000);
        printf("%s\n",buf);
        printf("may be  I  receive a stiring\n");
        ZeroMemory(buf,256);
    }
}

好的,Android Studio 的消息广播实验可以通过以下步骤完成: 1. 创建一个新的项目 在 Android Studio 中创建一个新的项目,并在应用程序的主活动中添加以下代码: ``` public class MainActivity extends AppCompatActivity { private Button broadcastButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); broadcastButton = findViewById(R.id.broadcast_button); broadcastButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcast.MY_ACTION"); sendBroadcast(intent); } }); } } ``` 在此代码段中,我们创建了一个按钮,当用户单击按钮时,会发送一个名为“com.example.broadcast.MY_ACTION”的广播。 2. 创建一个广播接收器 在应用程序中创建一个新的广播接收器,以便我们可以接收到发送的广播。为此,请创建一个新的 Java 类,并在其中添加以下代码: ``` public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Broadcast received!", Toast.LENGTH_SHORT).show(); } } ``` 在此代码段中,我们创建了一个新的广播接收器,并在接收到广播时显示一个短暂的 Toast 消息。 3. 注册广播接收器 在 AndroidManifest.xml 文件中,添加以下内容以注册广播接收器: ``` <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="com.example.broadcast.MY_ACTION" /> </intent-filter> </receiver> ``` 在此代码段中,我们将 MyBroadcastReceiver 类注册为接收名为“com.example.broadcast.MY_ACTION”的广播。 4. 运行应用程序 现在,您可以运行应用程序并单击“发送广播”按钮。您应该能够看到一个短暂的 Toast 消息,指示广播已成功接收。 这就是 Android Studio 中消息广播实验的基本步骤。您可以根据需要进行修改和扩展,以满足您的特定需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值