標籤:區域網路 網路編程 c++ 控制台
最近在學網路編程,學習了UDP的通訊原理。寫了基於UDP的服務端和用戶端,可以實現區域網路直接的通訊,可以實現一個服務端,對多個用戶端,實驗過兩個用戶端的,兩個用戶端可以接收到服務端的訊息,兩個用戶端的Message Service端也可以收到,兩個用戶端之間無法通訊。在接收方面,可能會出現接收混亂,因為是接收一句,發送一句。
下面是服務端的代碼,是在控制台上實現的.
#include <iostream>#include <winsock2.h>using namespace std;#pragma comment(lib, "ws2_32.lib")//串連庫int main(){//建立通訊端,相當於控制代碼WORD Version;WSADATA wData;Version = MAKEWORD(2, 2);int n = WSAStartup(Version, &wData);if(n != 0)//檢查是否出錯,不過一般不會出錯的{cout << "Error!" << endl;return -1;}SOCKET soc = socket(AF_INET, SOCK_DGRAM, 0);if(INVALID_SOCKET == soc){cout << "Error!" << endl;return -1;}//建立連接埠sockaddr_in addSer;addSer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addSer.sin_family = AF_INET;addSer.sin_port = htons(8008); //連接埠隨便,連接埠號碼的有效範圍是從0到65535。n = bind(soc, (sockaddr*)&addSer, sizeof(addSer)); //一般來說,大於49151的連接埠號碼都代表動態連接埠。綁定通訊端if(n == SOCKET_ERROR) //出錯檢查,出錯,可能連接埠被佔用了,需要換一個{cout << "Error!" << endl;return -1;}char Send[256]; //發送字串char Rev[256]; //接收字串sockaddr_in addClient; //接收方的地址資訊結構體int len = sizeof(sockaddr);while(1){int i = recvfrom(soc, Rev, 256, 0, (sockaddr*)&addClient, &len); //接受,阻塞在這,直到接收到資訊Rev[i] = '\0';if(Rev[0] == 'Q'){cout << "Char end!" << endl;break;}cout << inet_ntoa(addClient.sin_addr) << " say :" << Rev << endl; //輸出發送方的IP,和資訊cout << "Please say something : ";gets(Send);sendto(soc, Send, strlen(Send), 0, (sockaddr *)&addClient, len); //發送訊息}closesocket(soc); //關閉通訊端WSACleanup();return 0;}
下面的是用戶端的代碼:
#include <iostream>#include <winsock2.h>using namespace std;#pragma comment(lib, "ws2_32.lib")int main(){//建立通訊端,跟服務端的差不多WORD Version;WSADATA wData;Version = MAKEWORD(2, 2);int n = WSAStartup(Version, &wData);if(n != 0){cout << "Error!" << endl;return -1;}SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);if(INVALID_SOCKET == sockClient){cout << "Error!" << endl;return -1;}sockaddr_in addser;//不同在這裡,需要服務端的IP,連接埠addser.sin_addr.S_un.S_addr = inet_addr("192.168.1.100");addser.sin_family = AF_INET;addser.sin_port = htons(8008);char Send[256]; //發送的訊息char Rev[256]; //接收的訊息int len = sizeof(sockaddr);while(1){cout << "Please say something : ";gets(Send);sendto(sockClient, Send, strlen(Send), 0, (sockaddr*)&addser, len); //發送int i = recvfrom(sockClient, Rev, 256, 0, (sockaddr*)&addser, &len); //結束,阻塞在這Rev[i] = '\0';//直到接收到if(i == -1)cout << "服務端未開啟!" << endl;else{if(Rev[0] == 'Q'){cout << "Char end!" << endl;break;}cout << inet_ntoa(addser.sin_addr) << " say : " << Rev << endl; //輸出發送方的IP和訊息}}closesocket(sockClient); //關閉通訊端WSACleanup();return 0;}
測試的執行個體就不貼出來了,區域網路的其他人說話不是很好!~~~
網路編程~C++實現區域網路通訊