国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五台县| 敖汉旗| 永州市| 乌兰察布市| 固安县| 锡林浩特市| 宁乡县| 通辽市| 隆子县| 洪湖市| 海兴县| 芷江| 深泽县| 平乐县| 云南省| 冕宁县| 册亨县| 衡东县| 武乡县| 平安县| 巴塘县| 南澳县| 通河县| 平乡县| 东阳市| 留坝县| 瑞安市| 宁明县| 南部县| 迭部县| 巴中市| 墨竹工卡县| 安阳县| 凤山县| 桐城市| 石景山区| 阳朔县| 凤台县| 扶余县| 康保县| 郓城县|