Udp

基於無連接的Udp編程.

代碼註釋,如下:

  1. //Server.cpp  
  2. #include <stdio.h>  
  3. #include <winsock2.h>  
  4. #pragma comment(lib,"WS2_32.lib")  
  5.  
  6. #define BUF_SIZE 64  
  7.  
  8. int main()  
  9. {  
  10.     WSADATA wsadata; //包含DLL期望程序使用的版本和支持的最高版本等字段  
  11.     int retVal;  
  12.  
  13.     SOCKET sServer;  
  14.     char buf[BUF_SIZE];  
  15.  
  16.     //加載套接字DLL  
  17.     retVal=WSAStartup(MAKEWORD(2,2),&wsadata);  
  18.     if(retVal != 0)  
  19.     {  
  20.         printf("WSAStartup failed!\n");  
  21.     }  
  22.  
  23.     //創建套接字  
  24.     sServer=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);  
  25.     if(sServer == INVALID_SOCKET)  
  26.     {  
  27.         printf("socket failed!\n");  
  28.  
  29.         WSACleanup();  
  30.         return -1;  
  31.     }  
  32.  
  33.     //綁定套接字(綁定套接字時,需要明確指出服務器的各個地址字段)  
  34.     SOCKADDR_IN addrServ;  
  35.     addrServ.sin_family=AF_INET; //套接字屬於協議族TCP/IP  
  36.     addrServ.sin_port=htons(4999);  
  37.     addrServ.sin_addr.S_un.S_addr=INADDR_ANY;  
  38.  
  39.     retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));   
  40.     if(retVal == SOCKET_ERROR)  
  41.     {  
  42.         printf("bind failed!\n");  
  43.  
  44.         closesocket(sServer);  
  45.         WSACleanup();  
  46.         return -1;  
  47.     }  
  48.  
  49.       
  50.  
  51.     //接收數據  
  52.     SOCKADDR_IN addrClient;  //接收數據時,系統自動填充地址字段  
  53.     int len=sizeof(SOCKADDR_IN);  
  54.  
  55.     ZeroMemory(buf,BUF_SIZE);  
  56.  
  57.     retVal=recvfrom(sServer,buf,BUF_SIZE,0,(LPSOCKADDR)&addrClient,&len);  
  58.     if(retVal == SOCKET_ERROR)  
  59.     {  
  60.         printf("recvfrom failed!\n");  
  61.  
  62.         closesocket(sServer);  
  63.         WSACleanup();  
  64.         return -1;  
  65.     }  
  66.  
  67.     //  
  68.     printf("Server receives data: ");  
  69.     printf("%s\n",buf);  
  70.  
  71.     //  
  72.     closesocket(sServer);  
  73.     WSACleanup();  
  74.     return 0;  
  75. }  

 

  1. //Client.cpp  
  2. #include <stdio.h>  
  3. #include <winsock2.h>  
  4. #pragma comment(lib,"WS2_32.lib")  
  5.  
  6. #define BUF_SIZE 64  
  7.  
  8. int main()  
  9. {  
  10.     WSADATA wsadata;  
  11.     int retVal;  
  12.  
  13.     SOCKET sClient;  
  14.     char buf[BUF_SIZE];  
  15.  
  16.  
  17.     //加載套接字DLL  
  18.     retVal=WSAStartup(MAKEWORD(2,2),&wsadata);  
  19.     if(retVal != 0)  
  20.     {  
  21.         printf("WSAStartup failed!\n");  
  22.     }  
  23.  
  24.     //創建套接字  
  25.     sClient=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);  
  26.     if(sClient == INVALID_SOCKET)  
  27.     {  
  28.         printf("socket failed!\n");  
  29.  
  30.         WSACleanup();  
  31.         return -1;  
  32.     }  
  33.  
  34.       
  35.     //發送數據(發送數據時,需要明確指出服務器的各個地址字段)  
  36.     SOCKADDR_IN addrServ;  
  37.     addrServ.sin_family=AF_INET; //套接字屬於協議族TCP/IP  
  38.     addrServ.sin_port=htons(4999);  
  39.     addrServ.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  
  40.  
  41.     ZeroMemory(buf,BUF_SIZE);  
  42.     strcpy(buf,"Hello Udp!");  
  43.  
  44.     retVal=sendto(sClient,buf,BUF_SIZE,0,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));  
  45.     if(retVal == SOCKET_ERROR)  
  46.     {  
  47.         printf("sendto failed!\n");  
  48.  
  49.         closesocket(sClient);  
  50.         WSACleanup();  
  51.         return -1;  
  52.     }  
  53.  
  54.     //  
  55.     closesocket(sClient);  
  56.     WSACleanup();  
  57.     return 0;  

 

*************************************************************************

補充說明:

1.

#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)

#define INADDR_ANY              (u_long)0x00000000

 

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib") //#pragma comment(Comment-Type,"CommentString")

①頭文件,只有函數的聲明;(編譯階段連接進去)②庫文件,如果有DLL,則充當索引的作用;如果沒有,則包含函數的實現代碼;(鏈接階段)③DLL,在運行階段,把函數的實現代碼連接進去.

2.

 


typedef struct WSAData {
WORD wVersion; //系統希望程序使用的庫版本
WORD wHighVersion; //系統支持的最高版本
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR* lpVendorInfo; } WSADATA,
*LPWSADATA;

3.

 

int WSAStartup(
  WORD wVersionRequested,
  LPWSADATA lpWSAData
);

Return Values

The WSAStartup function returns zero if successful. Otherwise, it returns one of the error codes listed in the following.(WSASYSNOREADY | WSAEFAULT)

 4.

對於main()函數而言,返0,則表示成功執行;返其它,則表示程序執行異常.

*************************************************************************

 

函數原型:

1.

int sendto(
  SOCKET s,
  const char* buf,
  int len,
  int flags,
  const struct sockaddr* to,
  int tolen
);

int flags, //MSG_OOB | MSG_DONTROUTE

 

int flags, //MSG_OOB | MSG_PEEK

int recvfrom(
  SOCKET s,
  char FAR* buf,
  int len,
  int flags,
  struct sockaddr FAR* from,
  int FAR* fromlen
);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章