VC广播例程

#include <winsock2.h>

#include <ws2tcpip.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

 

#pragma comment(lib,"ws2_32.lib")    //包含必要的库

 

DWORD dwThreadId, dwThrdParam = 1;

HANDLE hThread;

 

WSADATA wsd;

struct sockaddr_in  local,

                                   remote,

                                   from;

 

SOCKET                            sock,sockM;

TCHAR                       recvbuf[1000],

                                          sendbuf[1000];

int                               len = sizeof(struct sockaddr_in),

                                          optval,

                                          ret;

DWORD                     i=0;

char                      ch;

 

DWORD WINAPI ThreadFunc( LPVOID lpParam ) ;

 

 

void main()

{

       //初始化winsock2并创建套接字

       WSAStartup(MAKEWORD(2,2),&wsd) ;

       sock =WSASocket(AF_INET, SOCK_DGRAM,0,NULL,0,

              WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);

 

 

 

       //绑定本地地址

       local.sin_family = AF_INET;

       local.sin_port = htons(25000);

       local.sin_addr.s_addr = INADDR_ANY;     //或者:inet_addr("192.168.0.100");

       bind(sock,(struct sockaddr *)&local,sizeof(local));

 

 

       //设置一个广播组

       remote.sin_family = AF_INET;

       remote.sin_port = htons(25000);

       remote.sin_addr.s_addr =inet_addr("234.5.6.7");

 

 

 

 

       //设置TTLoptval = 8大概为穿过路由器的个数

       optval = 8;

       setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char *)&optval,sizeof(int));

 

 

 

       //关闭LOOPBACK,否则发送时自己也能收到

       optval = 0;

       setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char *)&optval,sizeof(int));

 

 

       //将创建的套接字加入到广播组

       sockM = WSAJoinLeaf(sock,(SOCKADDR *)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_BOTH);

 

 

       //创建起一个线程,阻塞方式用来接收数据

    hThread = CreateThread(

        NULL,                        // no security attributes

        0,                           // use default stack size 

        ThreadFunc,                  // thread function

        &dwThrdParam,                // argument to thread function

        0,                           // use default creation flags 如果该参数为0,线程就会立即开始执行

        &dwThreadId);                // returns the thread identifier

 

 

       //进入主线程

       printf("Press space key to send,press ESC or 'q' to exit!/n");

       while(1)

       {

              if(kbhit())

              {

                     ch = getch();

                    

                     //按‘q’键或ESC退出

                     if(ch == 'q' || ch == 27) break;

 

 

                     //按空格键发送

                     if(ch == ' ')

                     {

                            sprintf(sendbuf,"helloworld:%d/n",i++);

                            printf("string:%d send:/t%s/n",i,sendbuf);

                            sendto(sock,(char *)sendbuf,20,0,(struct sockaddr *)&remote,sizeof(remote));

                     }

              }

       }

 

       closesocket(sock);

       WSACleanup();

}

 

 

//线程函数

DWORD WINAPI ThreadFunc( LPVOID lpParam )

{

       while(1)

       {

              ret = recvfrom(sock,recvbuf,20,0,(struct sockaddr *)&from,&len);

 

 

              printf("%s      from %s/n",recvbuf,inet_ntoa(from.sin_addr));

       }

}

 

 
实例2-1:演示C++程序的运行步骤。源代码在光盘中“\02\firstcpp”目录下。 实例2-2:Visual C++语言基本元素介绍。源代码在光盘中“\02\secondcpp”目录下。 实例2-3:cout流控制符setw的使用。源代码在光盘中“\02\thirdcpp”目录下。 实例2-4:增加域内填充字符。源代码在光盘中“\02\fourthcpp”目录下。 实例2-5:同一数据用不同进制输出结果。源代码在光盘中“\02\fifthcpp”目录下。 实例2-6:用浮点数的形式输出数据。源代码在光盘中“\02\sixthcpp”目录下。 实例2-7:数据的输入及输出。源代码在光盘中“\02\seventhcpp”目录下。 实例2-8:计算学生平均成绩。源代码在光盘中“\02\eighthcpp”目录下。 实例2-9:函数的调用。源代码在光盘中“\02\ninthcpp”目录下。 实例2-10:用指针传递参数。源代码在光盘中“\02\tenthcpp”目录下。 实例2-11:全局变量和局部变量。源代码在光盘中“\02\eleventhcpp”目录下。 实例2-12:使用指针注意内存的分配。源代码在光盘中“\02\twelfthcpp”目录下。 实例2-13:引用实例。源代码在光盘中“\02\thirteencpp”目录下。 实例2-14:虚函数的使用实例。源代码在光盘中“\02\fourteencpp”目录下。 。。。。。。 实例13-1:动态链接库(Dll)实例。源代码在光盘中“\13\dlltest ”目录下。 实例13-2:鼠标钩子应用实例。源代码在光盘中“\13\MouseHook”目录下。 实例13-3:键盘钩子应用实例。源代码在光盘中“\13\KeyboardHook”目录下。 实例14-1:WinSock网络程序:聊天室。源代码在光盘中“\14\WinSocketChat”目录下。 实例14-2:利用MSComm控件进行串口数据传输。源代码在光盘中“\14\MSComm”目录下。 实例14-3:简单的WinInet应用程序。源代码在光盘中“\14\SimpleNet”目录下。 实例15-1:创建Access数据库。源代码在光盘的“\15\Info”中。 实例15-2:MFC的ODBC数据库实例。源代码在光盘中“\15\Enroll”目录下。 实例15-3:利用ADO查询并操作数据库实例。源代码在光盘中“\15\AdoTest”目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值