本文僅實現了客戶端發送字符串到服務端,服務端將其轉換為大寫,再發送給服務端
本人並未系統學習過C++,如果有相關C++的表述錯誤,請諒解,此類錯誤不會影響您的閱讀
如果可以,多謝大佬指出錯誤
在編寫程序是,本人使用了CLION,如果你也使用clion,請先在cmakelists中添加一行
link_libraries(ws2_32)
相關內容直接閱讀代碼注釋即可
服務端
#include <iostream>
#include <winsock2.h>
int main(){
//異步套接字的啟動命令
WSADATA wsadata;
//第一個參數是版本號,第二個是WSADATA結構體變量的地址值
WSAStartup(MAKEWORD(2, 2), &wsadata);
SOCKET ServerSocket;
//創建一個socket
//第一個參數是族地址,用於指定下層的網路協議,AF_INET表示使用IPV4
//第二個參數是套接口類型,SOCK_DGRAM (數據報套接字)一般用於UDP
//詳情:https://blog.csdn.net/qing666888/article/details/50419875
//第三個參數表示協議
//三個參數類型都是正整數,這里使用了C++預設定的宏(沒有系統學過C++,說法有誤請諒解)
ServerSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//定義了一個網絡地址,sockaddr_in是一個結構體1
sockaddr_in sockAddrIn;
memset(&sockAddrIn,0, sizeof(sockAddrIn));
//指定族地址
sockAddrIn.sin_family=AF_INET;
//htons:Host to Network Short 將整型變量從主機字節順序轉變成網絡字節順序
sockAddrIn.sin_port=htons(9527);
//INADDR_ANY是一個宏,表示本機
sockAddrIn.sin_addr.s_addr =inet_addr("127.0.0.1");
//將創建的socket與地址綁定,返回值為0表示成功,-1表示失敗
int ret = bind(ServerSocket,(sockaddr*)&sockAddrIn,sizeof(sockAddrIn));
if(ret==SOCKET_ERROR){
std::cout<<"bind failed"<<std::endl;
return -1;
}
while (true){
char buf[100];
int len;
//開始接收信息
//第一個參數:套接字
//第二個參數:緩沖區
//第三個參數:緩沖區大小
//第四個參數:調用操作方式
//第五六個參數傳遞指針,在函數類被修改,函數運行后,分別得到相應的值
//第五個參數:接收到的地址
//第六個參數:接收到的信息實際長度
int recvRet = recvfrom(ServerSocket,buf, sizeof(buf),0,(sockaddr*)&sockAddrIn,&len);
//-1表示接收失敗
if(recvRet==-1){
// std::cout<<"recieve failed"<<std::endl;
continue;
}
//將小寫字母轉換為大寫
for(int i=0;i<len;i++){
if(buf[i]>='a'&&buf[i]<='z'){
buf[i]='A'+buf[i]-'a';
}
}
//第五個參數:指定要發送的目標ip和端口號
//第六個參數:第五個參數的長度
int sendRet = sendto(ServerSocket, buf, sizeof(buf), 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));
if (sendRet == -1) {
std::cout << "send failed"<< std::endl;
break;
}else{
std::cout << "send success"<< std::endl;
}
}
return 0;
}
}
客戶端
#include <iostream>
#include <winsock2.h>
int main(){
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
SOCKET Client;
Client = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
sockaddr_in sockAddrIn;
memset(&sockAddrIn,0, sizeof(sockAddrIn));
sockAddrIn.sin_family=AF_INET;
sockAddrIn.sin_port=htons(9527);
sockAddrIn.sin_addr.s_addr =inet_addr("127.0.0.1");
//設置socket的選項
int time_out=2000;
if(setsockopt(Client,SOL_SOCKET,SO_RCVTIMEO,(char*)&time_out,sizeof(time_out))!=0){
return -1;
}
while (true){
char buf[100];
int len;
scanf("%s",buf);
int sendRet = sendto(Client, buf, sizeof(buf), 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));
if (sendRet == -1) {
std::cout<<WSAGetLastError ()<<std::endl;
std::cout << "send failed"<< std::endl;
break;
}else{
std::cout << "send success"<< std::endl;
}
int recvRet = recvfrom(Client,buf, sizeof(buf),0,(sockaddr*)&sockAddrIn,&len);
if(recvRet==-1){
continue;
}else{
std::cout<<buf<<std::endl;
}
}
return 0;
}