现在的位置: 首页 > 综合 > 正文

VC广播例程

2013年10月09日 ⁄ 综合 ⁄ 共 2925字 ⁄ 字号 评论关闭

#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));

       }

}

 

 

抱歉!评论已关闭.