一个VC简单的UDP广播示例

本文提供了一个使用VC实现的UDP广播示例,包括接收端和发送端的代码。接收端通过创建线程监听特定端口,接收到广播消息后打印出来。发送端则设置套接字为广播类型,向网络上的广播地址发送消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接收端:
#include<stdlib.h>
//#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock2.h>
#include<windows.h>
#pragma comment (lib, "ws2_32.lib")
/*

HANDLE hr,hl,hbusy;

  struct  thrpar
  {
                SOCKET s;
  };

  struct recpar
  {
                  SOCKET srec;
                  struct sockaddr_in addr;
  };


 UINT recthread(LPVOID pp)
  {
                  SOCKET srec,s2;
                  struct recpar *prec=(struct recpar *)pp;
      sockaddr_in recaddr;

                  srec=prec->srec;
                  recaddr=prec->addr;
                  char buf[256];
                  DWORD ret;

      printf("recv thread start!");
                  ret=recv(srec,buf,256,0);
                  if(ret==0)
                  {
                                  printf("connect close!");
                                  closesocket(srec);
                                  return 0;
                  }
                  else if(ret==SOCKET_ERROR)
                  {
                                  printf("connect error!");
                                  closesocket(srec);
                                  return 0;
                  }
   printf("recv data:%s",buf);
     return 0;
  }

                 
   DWORD WINAPI listhread(LPVOID pp)
  {
                   ::MessageBox(NULL,"enter the listhread","KK",MB_OK);
                  struct thrpar *pthr=(struct thrpar*)pp;
                  SOCKET sl,saccept;
                  sockaddr_in here, there;
                  char name[256];
                  struct hostent *phost;
                  int ret;
      
                  gethostname(name,256);
                  phost=gethostbyname(name);

                  here.sin_family=AF_INET;
                  here.sin_port=htons(1024);
                  here.sin_addr.S_un.S_un_b.s_b1=phost->h_addr_list[0][0];
                  here.sin_addr.S_un.S_un_b.s_b2=phost->h_addr_list[0][1];
                  here.sin_addr.S_un.S_un_b.s_b3=phost->h_addr_list[0][2];
                  here.sin_addr.S_un.S_un_b.s_b4=phost->h_addr_list[0][3];
     
      sl=pthr->s;
                 
                  ret=bind(sl,(struct sockaddr *)&here,sizeof(here));
                  if(ret!=0)
                  {
                                  printf("bind error");
                                  return 0;
                  }
                  ret=listen(sl,5);
                  if(ret!=0)
                  {
                                   printf("listen error");
                                  return 0;
                  }
                  while(true)
                  {
                                  int nlen=sizeof(there);
                                  saccept=accept(sl,(struct sockaddr *)&there,&nlen);
                                  if(saccept==INVALID_SOCKET)
                                  {
                                                  printf("accept socket invalid");
                                  }
                                  DWORD wret=WaitForSingleObject(hbusy,500);
                                  if(wret==WAIT_TIMEOUT)
                                  {
                                                 send(saccept,"\0",1,0);
                                                closesocket(saccept);
                                                continue ;
                                 }
                                 DWORD recid;
                                  struct recpar *prec;
                                  prec->addr=there;
                                  prec->srec=saccept;
                                  
                                  hr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&listhread,prec,0,&recid);
                                 return 1;
                  }
                   return 1;
  }

void main(void)
{
                SOCKET s;
                sockaddr_in addrin;
                WSADATA wsdata;
                BOOL bsocket;
                char *smsg="this is a test";
                
                  WSAStartup(0x0202,&wsdata);
                 
                                s=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
                                hbusy=CreateSemaphore(NULL,0,2,NULL);
                                struct  thrpar *psc;
                                psc=new struct thrpar;
                                DWORD lisid;
                                psc->s=s;
                                
                                  hr=CreateThread(NULL,0,listhread,psc,0,&lisid);
                                  DWORD ret=WaitForSingleObject(hr,10000);
                                  if(ret==WAIT_OBJECT_0)printf("thread time out%d\r\n",lisid);
                                 
}*/
void main(void )
{
                SOCKET s;
                sockaddr_in from,a;
                WSADATA wsdata;
                BOOL optval;
                 //启?动??SOCKET库a,??版??本??为a2.0
                WSAStartup(0x0202,&wsdata);
                optval=TRUE;
                 //然??后??赋3值??给?两??个?地??址??,??一??个?用??来???绑???定??套???接??字??,??一??个?用??来???从???网??络?上??的??广?播??地??址??接??收??消?息??;??
                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);
                 //用??UDP初?始??化??套???接??字??
                s=socket(AF_INET,SOCK_DGRAM,0);
                  //设???置?该?套???接??字??为a广?播??类???型??,??
                setsockopt(s,SOL_SOCKET,SO_BROADCAST,( char FAR *)&optval,sizeof (optval));
                bind(s,(sockaddr *)&a, sizeof(sockaddr_in));
                 char buf[256];
                 while(1)
                { //从???广?播??地??址??接??收??消?息??,??注???意?a用??来???绑???定??的??地??址??和??接??收??消?息??的??地??址??是??不?一??样??的??
                                recvfrom(s,buf,256,0,( struct sockaddr FAR *)&from,(int FAR *)&fromlength);
                                Sleep(2000);
                                printf( "%s\n",buf);
                                ZeroMemory(buf,256);
                }
}

发送端:
#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" ;
                 //启?动??SOCKET库a,??版??本??为a2.0
                WSAStartup(0x0202,&wsdata);
                
                s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
                bsocket=TRUE;
                 //然??后??赋3值??给?地??址??,??用??来???从???网??络?上??的??广?播??地??址??接??收??消?息??;??
                addrto.sin_family=AF_INET;
    addrto.sin_addr.s_addr=INADDR_BROADCAST;
                addrto.sin_port=htons(5050);
                 bool opt=true ;
                 //设???置?该?套???接??字??为a广?播??类???型??,??
                setsockopt(s,SOL_SOCKET,SO_BROADCAST,( char FAR *)&opt,sizeof (opt));
                 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值