无连接网络通信程序UDP
生活随笔
收集整理的這篇文章主要介紹了
无连接网络通信程序UDP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
服務器端
#include <windows.h> #include <iostream.h> #include <winsock.h> #pragma comment(lib,"ws2_32")#define NO_FLAGS_SET 0#define PORT (u_short) 44965 #define MAXBUFLEN 256INT main(VOID) {WSADATA Data;//它存儲 被WSAStartup函數調用后返回的 Windows Sockets數據SOCKADDR_IN serverSockAddr;//服務器地址,他區分地址和端口號SOCKADDR_IN clientSockAddr;//客戶端地址SOCKET serverSocket;//服務器套接字SOCKET clientSocket;//客戶端套接字int addrLen=sizeof(SOCKADDR_IN);//獲得地址長度int status; //獲取WSAStartup返回的整數來判斷當前各種狀態int numrcv; //獲取接受數據過程是否有異常。char buffer[MAXBUFLEN];//緩沖區/* initialize the Windows Socket DLL */status=WSAStartup(MAKEWORD(1, 1), &Data);//調用庫函數并返回結果 /*初始化Winsock DLLif (status != 0)cerr << "ERROR: WSAStartup unsuccessful" << endl;//失敗/* zero the sockaddr_in structure *///memset(&serverSockAddr, 0,sizeof(serverSockAddr));/* specify the port portion of the address */serverSockAddr.sin_port=htons(PORT);//將端口從整形轉化成網絡字節序并賦值給服務器端//口/* specify the address family as Internet */serverSockAddr.sin_family=AF_INET;//表明協議類型是TCP/ip協議serverSockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");/* specify that the address does not matter */ /*INADDR_ANY 的具體含義是,綁定到0.0.0.0。此時,對所有的地址都將是有效的 serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);/* create a socket */serverSocket=socket(AF_INET, SOCK_DGRAM, 0);//創建服務器套接字if (serverSocket == INVALID_SOCKET)cerr << "ERROR: socket unsuccessful" << endl;int len = sizeof(serverSockAddr); //獲取服務器地址長度/* associate the socket with the address */bind(serverSocket, (LPSOCKADDR) &serverSockAddr,len);//將套接字與IP地址綁定/*if (status == SOCKET_ERROR)cerr << "ERROR: bind unsuccessful" << endl; //綁定失敗/* allow the socket to take connections *//*status=listen(serverSocket, 1);if (status == SOCKET_ERROR)cerr << "ERROR: listen unsuccessful" << endl; //監聽失敗/* accept the connection request when one is received *//*clientSocket=accept(serverSocket,(LPSOCKADDR) &clientSockAddr,&addrLen);*///cout << "Got the connection..." << endl;while(1){ numrcv=recvfrom(serverSocket, buffer, MAXBUFLEN, 0,(SOCKADDR*)&clientSockAddr,&len); //接收從客戶端發送過來的數據并返回結果。if ((numrcv == 0) || (numrcv == SOCKET_ERROR)){cout << "Connection terminated." << endl;status=closesocket(clientSocket);if (status == SOCKET_ERROR)cerr << "ERROR: closesocket unsuccessful"<< endl;status=WSACleanup();if (status == SOCKET_ERROR)cerr << "ERROR: WSACleanup unsuccessful" << endl;return(1); }cout << buffer << endl;} /* while */ }客戶端如下:
#include <windows.h> #include <iostream.h> #include <winsock.h> #pragma comment(lib,"ws2_32")#define NO_FLAGS_SET 0#define PORT (u_short) 44965 #define DEST_IP_ADDR "10.86.2.1" //Server addressINT main(VOID) {WSADATA Data;//它存儲 被WSAStartup函數調用后返回的 Windows Sockets數據SOCKADDR_IN destSockAddr;//目的套接字地址,他區分地址和端口號SOCKET client;//客戶端套接字int status;//獲取WSAStartup返回的整數來判斷當前各種狀態int numsnt; //獲取發送數據過程是否有異常。char *toSendtxt="Test String";/* initialize the Windows Socket DLL */status=WSAStartup(MAKEWORD(1, 1), &Data);//調用外部庫函數并返回結果/*if (status != 0)cerr << "ERROR: WSAStartup unsuccessful"//調用失敗<< endl;/* convert IP address into in_addr form *///destAddr=inet_addr(DEST_IP_ADDR);/* copy destAddr into sockaddr_in structure *//*memcpy(&destSockAddr.sin_addr,&destAddr, sizeof(destAddr));/* specify the port portion of the address */destSockAddr.sin_port=htons(PORT); //將端口從整形轉化成網絡字節序并賦值給目的套接//字端/* specify the address family as Internet */destSockAddr.sin_family=AF_INET;//表明協議類型是TCP/IP協議destSockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//設置服務器端的IP地址int len = sizeof(SOCKADDR_IN);/* create a socket */client=socket(AF_INET, SOCK_DGRAM, 0);//創建一個客戶端套接字/*if (destSocket == INVALID_SOCKET){cerr << "ERROR: socket unsuccessful" << endl;//創建失敗status=WSACleanup();if (status == SOCKET_ERROR)cerr << "ERROR: WSACleanup unsuccessful" << endl;return(1);}/*cout << "Trying to connect to IP Address: "<< DEST_IP_ADDR << endl;/* connect to the server */while(1){cout << "Sending..." << endl; //控制臺輸出Sending...numsnt=sendto(client, toSendtxt, strlen(toSendtxt) + 1, NO_FLAGS_SET,(const SOCKADDR*)&destSockAddr,len);//發送數據并獲取結果,各參數上面有說明if (numsnt != (int)strlen(toSendtxt) + 1){cout << "Connection terminated" << endl;//連接中斷status=closesocket(client); //關閉套接字if (status == SOCKET_ERROR)cerr << "ERROR: closesocket unsuccessful"//關閉失敗<< endl;status=WSACleanup(); //終止調用外部庫if (status == SOCKET_ERROR)cerr << "ERROR: WSACleanup unsuccessful"//終止失敗<< endl;return(1);}/* Wait before sending the message again */Sleep(4800); //線程睡眠4.8秒 } /* while */ }小程序制作過程中遇到的問題
做C++socket UDP編程,server端接收的數據不完整,中間參雜十六進制的CDCDCDCD,不知道為何?
解決:
? ? ? ?雖然發送的buffer全是正確的,發送數據的長度也是正確的。接數據的長度不正確,接收的數據不完整,應該是原來數組沒有初始化,到時接收數據不完整時,接收數組中就出現了CDCDCDCD。之后我將數組進行初始化賦值一下,問題得到解決。
總結
以上是生活随笔為你收集整理的无连接网络通信程序UDP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html的实战性介绍
- 下一篇: R语言第九讲 验证集法