无连接网络通信程序UDP
生活随笔
收集整理的這篇文章主要介紹了
无连接网络通信程序UDP
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
服務(wù)器端
#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函數(shù)調(diào)用后返回的 Windows Sockets數(shù)據(jù)SOCKADDR_IN serverSockAddr;//服務(wù)器地址,他區(qū)分地址和端口號SOCKADDR_IN clientSockAddr;//客戶端地址SOCKET serverSocket;//服務(wù)器套接字SOCKET clientSocket;//客戶端套接字int addrLen=sizeof(SOCKADDR_IN);//獲得地址長度int status; //獲取WSAStartup返回的整數(shù)來判斷當(dāng)前各種狀態(tài)int numrcv; //獲取接受數(shù)據(jù)過程是否有異常。char buffer[MAXBUFLEN];//緩沖區(qū)/* initialize the Windows Socket DLL */status=WSAStartup(MAKEWORD(1, 1), &Data);//調(diào)用庫函數(shù)并返回結(jié)果 /*初始化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);//將端口從整形轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)序并賦值給服務(wù)器端//口/* specify the address family as Internet */serverSockAddr.sin_family=AF_INET;//表明協(xié)議類型是TCP/ip協(xié)議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。此時(shí),對所有的地址都將是有效的 serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);/* create a socket */serverSocket=socket(AF_INET, SOCK_DGRAM, 0);//創(chuàng)建服務(wù)器套接字if (serverSocket == INVALID_SOCKET)cerr << "ERROR: socket unsuccessful" << endl;int len = sizeof(serverSockAddr); //獲取服務(wù)器地址長度/* 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; //監(jiān)聽失敗/* 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); //接收從客戶端發(fā)送過來的數(shù)據(jù)并返回結(jié)果。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函數(shù)調(diào)用后返回的 Windows Sockets數(shù)據(jù)SOCKADDR_IN destSockAddr;//目的套接字地址,他區(qū)分地址和端口號SOCKET client;//客戶端套接字int status;//獲取WSAStartup返回的整數(shù)來判斷當(dāng)前各種狀態(tài)int numsnt; //獲取發(fā)送數(shù)據(jù)過程是否有異常。char *toSendtxt="Test String";/* initialize the Windows Socket DLL */status=WSAStartup(MAKEWORD(1, 1), &Data);//調(diào)用外部庫函數(shù)并返回結(jié)果/*if (status != 0)cerr << "ERROR: WSAStartup unsuccessful"//調(diào)用失敗<< 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); //將端口從整形轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)序并賦值給目的套接//字端/* specify the address family as Internet */destSockAddr.sin_family=AF_INET;//表明協(xié)議類型是TCP/IP協(xié)議destSockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//設(shè)置服務(wù)器端的IP地址int len = sizeof(SOCKADDR_IN);/* create a socket */client=socket(AF_INET, SOCK_DGRAM, 0);//創(chuàng)建一個(gè)客戶端套接字/*if (destSocket == INVALID_SOCKET){cerr << "ERROR: socket unsuccessful" << endl;//創(chuàng)建失敗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);//發(fā)送數(shù)據(jù)并獲取結(jié)果,各參數(shù)上面有說明if (numsnt != (int)strlen(toSendtxt) + 1){cout << "Connection terminated" << endl;//連接中斷status=closesocket(client); //關(guān)閉套接字if (status == SOCKET_ERROR)cerr << "ERROR: closesocket unsuccessful"//關(guān)閉失敗<< endl;status=WSACleanup(); //終止調(diào)用外部庫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端接收的數(shù)據(jù)不完整,中間參雜十六進(jìn)制的CDCDCDCD,不知道為何?
解決:
? ? ? ?雖然發(fā)送的buffer全是正確的,發(fā)送數(shù)據(jù)的長度也是正確的。接數(shù)據(jù)的長度不正確,接收的數(shù)據(jù)不完整,應(yīng)該是原來數(shù)組沒有初始化,到時(shí)接收數(shù)據(jù)不完整時(shí),接收數(shù)組中就出現(xiàn)了CDCDCDCD。之后我將數(shù)組進(jìn)行初始化賦值一下,問題得到解決。
總結(jié)
以上是生活随笔為你收集整理的无连接网络通信程序UDP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html的实战性介绍
- 下一篇: R语言第九讲 验证集法