您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何用C++代碼實現簡易UDP網絡聊天室”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“如何用C++代碼實現簡易UDP網絡聊天室”文章能幫助大家解決問題。
NetSrv.cpp
//服務器端 #include<Winsock2.h> #include<stdio.h> void main() { //加載套接字庫 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData); if(err!=0){ return; } if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){ WSACleanup(); return; } //創建套接字 SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);//第二個參數是數據報套接字 SOCKADDR_IN addrSrv;//對于服務器端,也就是接收端,先進行一個綁定,定義一個地址結構體的變量 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//對結構體中的成員進行賦值,用htonl轉換一下 //將主機數轉換成無符號長整型的網絡字節順序。本函數將一個32位數從主機字節順序轉換成網絡字節順序。 addrSrv.sin_family=AF_INET;//地址族 addrSrv.sin_port=htons(6000);//端口號 //綁定套接字 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//將本地主機地址和端口進行綁定 //套接字,地址結構的指針,地址結構的長度 char recvBuf[100];//字符數組,接收信息 char sendBuf[100];//發送信息 char tempBuf[200];//存放中間數據 SOCKADDR_IN addrClient;//在接收的時候,獲取對方的信息,地址結構體的變量 int len=sizeof(SOCKADDR);//初始化,長度為,地址結構體的長度 while(1)//保證通訊過程能夠持續進行 { //等待并接收數據 recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); //套接字,接收數據buf,其長度,,地址結構的指針,指向整型的指針主要用來返回所接收的地址長度 if("q"==recvBuf[0])//判斷接收的數據第一個字符是q嗎, { sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len); //若是,服務器也發一個q字符,套接字,q,長度多發一個字節,,地址用剛剛得到的,最后一個是地址結構的長度,通過len可得 printf("Chat end! "); break; } //如果接收的不是q,那么對數據進行一個格式化,放到tempBuf中,點分十進制的ip地址,所接收的數據。 sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf); printf("%s ",tempBuf);//將數據打印輸出 //發送數據 printf("please input data: "); gets(sendBuf);//從標準輸入流中獲取一行數據,當我們輸入一行數據,以回車,就把數據放到指定的內存指針中了。 sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); //套接字,所要發送的數據,(這個是數據長度,用strlen獲取)多發一個字節,所發送的地址, } //關閉套接字 closesocket(sockSrv); WSACleanup();//終止對套接字的使用 }
NetClient.cpp
//客戶端 #include<Winsock2.h> #include<stdio.h> void main(){ //加載套接字庫 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData); if(err!=0){ return; } if(LOBYTE(wsaData.wVersion)!=1|| HIBYTE(wsaData.wVersion)!=1){ WSACleanup( ); return; } //創建套接字 SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0); //,類型(數據報),自動選擇合適協議 SOCKADDR_IN addrSrv; //基于upd的客戶端(發送端),不需要去綁定,但是需要設置發送到對方機器的地址信息 //服務器端的地址信息,因為在本機上,所以還是127.0.0.1),用inet_addr將點分十進制轉換成ulang類型 addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000);//設置服務器端程序在哪個端口上等待數據 char recvBuf[100];//接收數據 char sendBuf[100];//發送數據 char tempBuf[200];//臨時數據的存儲 int len = sizeof(SOCKADDR);//接收所返回的地址結構的長度 while(1) { //發送數據 printf("Please input data: "); gets(sendBuf); sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len); //等待并接收數據 recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len); if("q"==recvBuf[0]) { sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len); printf("Chat end! "); break; } sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf); //服務器端ip地址信息(格式化),接收的數據 printf("%s ",tempBuf); } //關閉套接字 closesocket(sockClient); WSACleanup(); }
ws2_32.lib
關于“如何用C++代碼實現簡易UDP網絡聊天室”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。