本文仅实现了客户端发送字符串到服务端,服务端将其转换为大写,再发送给服务端
本人并未系统学习过C++,如果有相关C++的表述错误,请谅解,此类错误不会影响您的阅读
如果可以,多谢大佬指出错误
在编写程序是,本人使用了CLION,如果你也使用clion,请先在cmakelists中添加一行
link_libraries(ws2_32)
相关内容直接阅读代码注释即可
服务端
#include
#include
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"<='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
#include
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<