亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言UDP傳輸系統源碼

2020-05-23 13:33:40
字體:
來源:轉載
供稿:網友

 本文實例為大家分享了C語言UDP傳輸系統的具體代碼,供大家參考,具體內容如下

/*加載庫文件*/#pragma comment( lib, "ws2_32.lib" )/*加載頭文件*/#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <stdlib.h>/*定義多播常量*/#define MCASTADDR   "224.3.5.8"#define MCASTPORT   25000#define BUFSIZE    1024#define MCOUNT    10/*定義廣播常量*/#define BCASTPORT   5050#define BCOUNT    10/*定義廣播全局變量*/SOCKET       socketBro;SOCKET       socketRec;struct sockaddr_in addrBro;struct sockaddr_in addrRec;BOOL        broadSendFlag;BOOL        broadFlag;DWORD       bCount;DWORD       bcastAddr;short       bPort;/*定義多播全局變量*/SOCKET       socketMul;SOCKET       sockJoin;struct sockaddr_in addrLocal;struct sockaddr_in addrMul;BOOL        multiSendFlag;BOOL        bLoopBack;  BOOL        multiFlag;DWORD       dwInterface; DWORD       dwMulticastGroup;DWORD       mCount;     short       mPort;      /*自定義函數*/void initial();void GetArgments(int argc, char **argv);void userHelpAll();void userHelpBro();void userHelpMul();void broadcastSend();void broadcastRec();void mulControl();void multicastSend();void multicastRec();/*初始化全局變量函數*/void initial(){  /*初始化廣播全局變量*/  bPort = BCASTPORT;  bCount = BCOUNT;  bcastAddr = INADDR_BROADCAST;  broadSendFlag = FALSE;  broadFlag = FALSE;  multiFlag = FALSE;  /*初始化多播全局變量*/  dwInterface = INADDR_ANY;  dwMulticastGroup = inet_addr(MCASTADDR);  mPort = MCASTPORT;  mCount = MCOUNT;  multiSendFlag = FALSE;  bLoopBack = FALSE;}/*參數獲取函數*/void GetArgments(int argc, char **argv){  int i;  /*如果參數個數小于2個*/  if(argc<=1)  {    userHelpAll();    return ;  }  /*獲取廣播選項*/  if(argv[1][0]=='-'&&argv[1][1]=='b')  {    /*廣播標志設置為真*/    broadFlag = TRUE;    for(i=2; i < argc ;i++)   {      if (argv[i][0] == '-')   {        switch (tolower(argv[i][1]))     {          /*如果是發送者*/         case 's':             broadSendFlag = TRUE;        break;          /*廣播的地址*/         case 'h':            if (strlen(argv[i]) > 3)              bcastAddr = inet_addr(&argv[i][3]);        break;          /*廣播的端口號*/         case 'p':            if (strlen(argv[i]) > 3)              bPort = atoi(&argv[i][3]);        break;          /*廣播(接收或者發送)的數量*/         case 'n':             bCount = atoi(&argv[i][3]);        break;          /*其他情況顯示用戶幫助,終止程序*/         default:      {             userHelpBro();             ExitProcess(-1);      }        break;     }   }   }    return ;  }  /*獲取多播選項*/  if(argv[1][0]=='-'&&argv[1][1]=='m')  {    /*多播標志設置為真*/    multiFlag = TRUE;    for(i=2; i < argc ;i++)   {      if (argv[i][0] == '-')   {        switch (tolower(argv[i][1]))     {          /*如果是發送者*/         case 's':             multiSendFlag = TRUE;        break;          /*多播地址*/         case 'h':             if (strlen(argv[i]) > 3)              dwMulticastGroup = inet_addr(&argv[i][3]);        break;          /*本地接口地址*/         case 'i':             if (strlen(argv[i]) > 3)              dwInterface = inet_addr(&argv[i][3]);        break;          /*多播端口號*/         case 'p':             if (strlen(argv[i]) > 3)              mPort = atoi(&argv[i][3]);        break;          /*環回標志設置為真*/         case 'l':             bLoopBack = TRUE;        break;          /*發送(接收)的數量*/         case 'n':            mCount = atoi(&argv[i][3]);        break;          /*其他情況,顯示用戶幫助,終止程序*/         default:           userHelpMul();        break;     }   }   }    }  return;}/*全局用戶幫助函數*/void userHelpAll(){  printf("Please choose broadcast[-b] or multicast[-m] !/n");   printf("userHelpAll: -b [-s][p][-h][-n] | -m[-s][-h][-p][-i][-l][-n]/n");  userHelpBro();  userHelpMul();}/*廣播用戶幫助函數*/void userHelpBro(){  printf("Broadcast: -b -s:str -p:int -h:str -n:int/n");  printf("      -b   Start the broadcast program./n");  printf("      -s   Act as server (send data); otherwise/n");  printf("         receive data. Default is receiver./n");  printf("      -p:int Port number to use/n ");  printf("         The default port is 5050./n");  printf("      -h:str The decimal broadcast IP address./n");  printf("      -n:int The Number of messages to send/receive./n");  printf("         The default number is 10./n");}/*多播用戶幫助函數*/void userHelpMul(){  printf("Multicast: -m -s -h:str -p:int -i:str -l -n:int/n");  printf("      -m   Start the multicast program./n");  printf("      -s   Act as server (send data); otherwise/n");  printf("          receive data. Default is receiver./n");  printf("      -h:str The decimal multicast IP address to join/n");  printf("          The default group is: %s/n", MCASTADDR);  printf("      -p:int Port number to use/n");  printf("          The default port is: %d/n", MCASTPORT);  printf("      -i:str Local interface to bind to; by default /n");  printf("          use INADDRY_ANY/n");  printf("      -l   Disable loopback/n");  printf("      -n:int Number of messages to send/receive/n");  ExitProcess(-1);}/*廣播消息發送函數*/void broadcastSend(){  /*設置廣播的消息*/  char *smsg="The message received is from sender!";  BOOL opt=TRUE;  int nlen=sizeof(addrBro);  int ret;  DWORD i=0;    /*創建UDP套接字*/  socketBro=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);  /*如果創建失敗*/  if(socketBro==INVALID_SOCKET)  {    printf("Create socket failed:%d/n",WSAGetLastError());    WSACleanup();    return;  }    /*設置廣播地址各個選項*/  addrBro.sin_family=AF_INET;  addrBro.sin_addr.s_addr=bcastAddr;  addrBro.sin_port=htons(bPort);    /*設置該套接字為廣播類型*/  if (setsockopt(socketBro,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,                     sizeof(opt))==SOCKET_ERROR)  /*如果設置失敗*/  {    printf("setsockopt failed:%d",WSAGetLastError());    closesocket(socketBro);    WSACleanup();    return;  }  /*循環發送消息*/  while(i<bCount)  {    /*延遲1秒*/    Sleep(1000);    /*從廣播地址發送消息*/    ret=sendto(socketBro,smsg,256,0,(struct sockaddr*)&addrBro,nlen);    /*如果發送失敗*/    if(ret==SOCKET_ERROR)      printf("Send failed:%d",WSAGetLastError());    /*如果發送成功*/    else    {       printf("Send message %d!/n",i);    }    i++;  }  /*發送完畢后關閉套接字、釋放占用資源*/  closesocket(socketBro);  WSACleanup();}/*廣播消息接收函數*/void broadcastRec(){    BOOL optval = TRUE;  int addrBroLen;  char buf[256];  DWORD i=0;  /*該地址用來綁定套接字*/  addrRec.sin_family=AF_INET;  addrRec.sin_addr.s_addr=0;  addrRec.sin_port=htons(bPort);  /*該地址用來接收網路上廣播的消息*/  addrBro.sin_family=AF_INET;  addrBro.sin_addr.s_addr=bcastAddr;  addrBro.sin_port=htons(bPort);    addrBroLen=sizeof(addrBro);  //創建UDP套接字  socketRec=socket(AF_INET,SOCK_DGRAM,0);  /*如果創建失敗*/  if(socketRec==INVALID_SOCKET)  {    printf("Create socket error:%d",WSAGetLastError());    WSACleanup();    return;  }  /*設置該套接字為可重用類型*/  if(setsockopt(socketRec,SOL_SOCKET,SO_REUSEADDR,(char FAR *)&optval,                          sizeof(optval))==SOCKET_ERROR)  /*如果設置失敗*/  {    printf("setsockopt failed:%d",WSAGetLastError());    closesocket(socketRec);    WSACleanup();    return;  }  /*綁定套接字和地址*/  if(bind(socketRec,(struct sockaddr *)&addrRec,                sizeof(struct sockaddr_in))==SOCKET_ERROR)  /*如果綁定失敗*/  {    printf("bind failed with: %d/n", WSAGetLastError());    closesocket(socketRec);    WSACleanup();    return ;  }  /*從廣播地址接收消息*/  while(i<bCount)  {    recvfrom(socketRec,buf,256,0,(struct sockaddr FAR *)&addrBro,(int FAR *)&addrBroLen);    /*延遲2秒鐘*/    Sleep(2000);    /*輸出接收到緩沖區的消息*/    printf("%s/n",buf);    /*情況緩沖區*/    ZeroMemory(buf,256);    i++;  }  /*接收完畢后關閉套接字、釋放占用資源*/  closesocket(socketRec);  WSACleanup();}/*多播控制函數*/void mulControl(){  int optval;   /*創建UDP套接字,用于多播*/  if ((socketMul = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0,         WSA_FLAG_MULTIPOINT_C_LEAF          | WSA_FLAG_MULTIPOINT_D_LEAF          | WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)  {    printf("socket failed with: %d/n", WSAGetLastError());    WSACleanup();    return ;  }    /*設置本地接口地址*/  addrLocal.sin_family = AF_INET;  addrLocal.sin_port = htons(mPort);  addrLocal.sin_addr.s_addr = dwInterface;    /*將UDP套接字綁定到本地地址上*/  if (bind(socketMul, (struct sockaddr *)&addrLocal,                   sizeof(addrLocal)) == SOCKET_ERROR)  /*如果綁定失敗*/  {    printf("bind failed with: %d/n", WSAGetLastError());    closesocket(socketMul);    WSACleanup();    return ;  }  /*設置多播地址各個選項*/  addrMul.sin_family   = AF_INET;  addrMul.sin_port    = htons(mPort);  addrMul.sin_addr.s_addr = dwMulticastGroup;  /*重新設置TTL值*/  optval = 8;  /*設置多播數據的TTL(存在時間)值。默認情況下,TTL值是1*/  if (setsockopt(socketMul, IPPROTO_IP, IP_MULTICAST_TTL,     (char *)&optval, sizeof(int)) == SOCKET_ERROR)  /*如果設置失敗*/  {    printf("setsockopt(IP_MULTICAST_TTL) failed: %d/n",WSAGetLastError());    closesocket(socketMul);    WSACleanup();    return ;  }  /*如果指定了返還選項*/  if (bLoopBack)  {    /*設置返還選項為假,禁止將發送的數據返還給本地接口*/    optval = 0;    if (setsockopt(socketMul, IPPROTO_IP, IP_MULTICAST_LOOP,      (char *)&optval, sizeof(optval)) == SOCKET_ERROR)    /*如果設置失敗*/   {      printf("setsockopt(IP_MULTICAST_LOOP) failed: %d/n",        WSAGetLastError());      closesocket(socketMul);      WSACleanup();      return ;    }  }    /*加入多播組*/  if ((sockJoin = WSAJoinLeaf(socketMul, (SOCKADDR *)&addrMul,                sizeof(addrMul), NULL, NULL, NULL, NULL,                JL_BOTH)) == INVALID_SOCKET)  /*如果加入不成功*/  {    printf("WSAJoinLeaf() failed: %d/n", WSAGetLastError());    closesocket(socketMul);    WSACleanup();    return ;  }}/*多播消息發送函數*/void multicastSend(){    TCHAR sendbuf[BUFSIZE];  DWORD i;  int ret;  mulControl();  /*發送mCount條消息*/  for(i = 0; i < mCount; i++)  {    /*將待發送的消息寫入發送緩沖區*/    sprintf(sendbuf, "server 1: This is a test: %d", i);    ret=sendto(socketMul, (char *)sendbuf, strlen(sendbuf), 0,        (struct sockaddr *)&addrMul, sizeof(addrMul));    /*如果發送失敗*/    if(ret==SOCKET_ERROR)    {      printf("sendto failed with: %d/n",WSAGetLastError());      closesocket(sockJoin);      closesocket(socketMul);      WSACleanup();      return ;    }    /*如果發送成功*/    else      printf("Send message %d/n",i);     Sleep(500);   }  /*關閉套接字、釋放占用資源*/  closesocket(socketMul);  WSACleanup();}/*多播消息接收函數*/void multicastRec(){  DWORD i;  struct sockaddr_in from;  TCHAR recvbuf[BUFSIZE];  int ret;  int len = sizeof(struct sockaddr_in);  mulControl();  /*接收mCount條消息*/  for(i = 0; i < mCount; i++)  {    /*將接收的消息寫入接收緩沖區*/    if ((ret = recvfrom(socketMul, recvbuf, BUFSIZE, 0,        (struct sockaddr *)&from, &len)) == SOCKET_ERROR)    /*如果接收不成功*/   {      printf("recvfrom failed with: %d/n",WSAGetLastError());      closesocket(sockJoin);      closesocket(socketMul);      WSACleanup();       return ;    }    /*接收成功,輸出接收的消息*/    recvbuf[ret] = 0;    printf("RECV: '%s' from <%s>/n", recvbuf,inet_ntoa(from.sin_addr));   }  /*關閉套接字、釋放占用資源*/  closesocket(socketMul);  WSACleanup();}/*主函數*/int main(int argc, char **argv){  WSADATA wsd;  initial();  GetArgments(argc, argv);  /*初始化Winsock*/  if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)  {    printf("WSAStartup() failed/n");    return -1;  }  /*如果是執行廣播程序*/  if(broadFlag)  {    /*以發送者身份發送消息*/    if(broadSendFlag)   {      broadcastSend();      return 0;   }    /*以接收者身份接收消息*/    else   {      broadcastRec();      return 0;   }  }  /*如果是執行多播程序*/  if(multiFlag)  {    /*以發送者身份發送消息*/    if(multiSendFlag)    {      multicastSend();      return 0;    }    /*以接收者身份接收消息*/    else     {      multicastRec();      return 0;   }  }  return 0;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区福利| 中国china体内裑精亚洲片| 欧美电影在线观看| 亚洲一区制服诱惑| 久久夜色精品国产| 国产成人拍精品视频午夜网站| 草民午夜欧美限制a级福利片| 国产精品视频男人的天堂| 97在线观看视频国产| 亚洲国产日韩精品在线| 国产亚洲精品91在线| 日韩高清免费观看| 国产精品99免视看9| 国产精品第一区| 亚洲精品日韩丝袜精品| 欧美精品www在线观看| 欧美日韩亚洲高清| 26uuu另类亚洲欧美日本老年| 国产视频福利一区| 日韩欧美一区二区三区久久| 亚洲综合在线播放| 亚洲а∨天堂久久精品喷水| 久久久天堂国产精品女人| 亚洲天堂视频在线观看| 国产亚洲精品91在线| 国产精品偷伦免费视频观看的| 国产精品第100页| 日韩欧美一区二区在线| 欧美精品免费看| 久久亚洲精品小早川怜子66| 成人观看高清在线观看免费| 亚洲精品一区二区三区不| 国产精品久久久久久av下载红粉| 亚洲美女在线观看| 日韩国产精品视频| 色yeye香蕉凹凸一区二区av| 久久国产视频网站| 日韩有码在线观看| 亚洲深夜福利网站| 91成人福利在线| 欧美激情亚洲视频| 亚洲国产精品va| 在线播放国产一区中文字幕剧情欧美| 久久亚洲国产精品成人av秋霞| 欧美电影免费观看高清| 51色欧美片视频在线观看| 高清视频欧美一级| 国产日韩换脸av一区在线观看| 久久免费国产精品1| 国产91精品青草社区| 欧美洲成人男女午夜视频| 韩日精品中文字幕| 97婷婷涩涩精品一区| 国产高清在线不卡| 久久中文字幕在线视频| 亚洲欧美一区二区三区四区| 日韩中文字幕精品| 亚洲成人黄色网| 97国产成人精品视频| 亚洲欧美综合精品久久成人| 国产精品一区专区欧美日韩| 欧美中文在线视频| 亚洲精品美女久久久| 亚洲精品色婷婷福利天堂| 色爱av美腿丝袜综合粉嫩av| 91精品国产免费久久久久久| 久热精品视频在线| 日韩精品久久久久久久玫瑰园| 亚洲一区第一页| 国产精品日韩在线播放| 欧美视频专区一二在线观看| 色综合亚洲精品激情狠狠| 欧美人成在线视频| 黄色成人在线播放| 日韩av快播网址| 欧美日韩另类在线| 91精品国产99久久久久久| 奇米成人av国产一区二区三区| 欧美电影免费观看高清| 亚洲成人av片在线观看| 亚洲免费视频在线观看| 日韩成人av一区| 夜夜嗨av色综合久久久综合网| 亚洲国产精品va在线看黑人动漫| 欧美wwwwww| 日韩免费av片在线观看| 欧美天天综合色影久久精品| 国产有码在线一区二区视频| 日本成人在线视频网址| 国产精品久久久久秋霞鲁丝| 91久久久久久久久| 亚洲日韩欧美视频一区| 欧美激情一区二区三区成人| 久久免费少妇高潮久久精品99| 91久久久亚洲精品| 欧美日韩一区二区免费视频| 欧美日本高清视频| 日韩亚洲精品视频| 日韩一区二区福利| 亚洲一区亚洲二区亚洲三区| 中文字幕亚洲欧美日韩高清| 欧美日韩国产成人高清视频| 91精品久久久久久久久久久久久久| 欧美极品在线播放| 久久人人爽人人爽人人片av高请| 色悠久久久久综合先锋影音下载| 欧美视频13p| 国产精品日韩精品| 69久久夜色精品国产69乱青草| 日韩成人黄色av| 欧美在线日韩在线| 成人免费在线视频网址| 日本精品久久中文字幕佐佐木| 久久久久久久久爱| 精品视频在线导航| 中文字幕日韩高清| 久久久国产在线视频| 欧美国产日本高清在线| 国产亚洲精品va在线观看| 国产主播在线一区| 日韩av123| 亚洲国产古装精品网站| 欧美成年人在线观看| 国产精品日韩在线| 欧美主播福利视频| 国产丝袜一区视频在线观看| 成人免费视频xnxx.com| 亚洲精品xxx| 国产成一区二区| 国产精品久久国产精品99gif| 九九精品在线视频| 国产精品88a∨| 国产免费一区二区三区在线观看| www高清在线视频日韩欧美| 在线观看精品自拍私拍| 中文字幕亚洲无线码在线一区| 色天天综合狠狠色| 一区二区三区www| 亚洲人精品午夜在线观看| 国产小视频国产精品| 黄色91在线观看| 欧美福利视频在线| 亚洲福利视频免费观看| 播播国产欧美激情| 伊人伊成久久人综合网小说| 国产亚洲欧洲高清一区| 美女999久久久精品视频| 98精品国产高清在线xxxx天堂| 欧美一级片在线播放| 992tv成人免费影院| 欧美精品video| 在线视频免费一区二区| 日韩少妇与小伙激情| 国产在线观看91精品一区| 日韩经典中文字幕在线观看| 3344国产精品免费看| 69视频在线免费观看| 国产精品一区二区三区成人| 国产美女高潮久久白浆| 国产精品视频成人| 亚洲欧美第一页| 亚洲欧美日韩网| 午夜剧场成人观在线视频免费观看| 亚洲国产精彩中文乱码av在线播放|