大家好,欢迎来到IT知识分享网。
这篇文章不详细说socket的基础理论直接聚焦代码方面的实操,毕竟刚刚开始学这个的时候还是得先上手后才能更好的去理解背后的原理和知识。一般的工作中也是要求先使用后去理解。
(开发/编译环境:ubuntu )
1.服务端:
服务端我我们需要先完成的代码,整个的过程如下:
1.创建sokcet。socket()
2.设置地址。struct sockaddr_in service_addr;
3.绑定。bind();
4.监听。listen();
5.链接。accept();
6.收发消息。read()/send()
7.关闭sokcet。close
接下来我们直接看服务端的代码->service_socket.cpp:
#include<iostream> #include<sys/socket.h> #include<arpa/inet.h> #include<string> #include<unistd.h> int main(){ int service_fd,new_socket; struct sockaddr_in service_addr; char buffer[1024] = {0}; //创建socket std::cout<<"creator socket\n"; service_fd = socket(AF_INET,SOCK_STREAM,0); if(service_fd < 0){ std::cout<<"creator socket failed"<<std::endl; return 1; } //设置地址 service_addr.sin_family = AF_INET; service_addr.sin_addr.s_addr = INADDR_ANY; service_addr.sin_port = htons(8080); std::cout<<"bind\n"; //绑定 int bind_ret = bind(service_fd,(struct sockaddr*)&service_addr,sizeof(service_addr)); if(bind_ret < 0){ std::cout<<"bind failed\n"; return 1; } std::cout<<"listen\n"; //监听 if(listen(service_fd,10) < 0){ std::cout<<"listen failed"; return 1; } //链接 std::cout<<"accept\n"; socklen_t addr_len = sizeof(service_addr); while(1){ new_socket = accept(service_fd,(struct sockaddr*)&service_addr,&addr_len); if(new_socket < 0){ std::cout<<"accept failed\n"; continue; }else{ std::cout<<"accept success\n"; break; } } //接受消息 std::cout<<"read msg\n"; int read_ret = read(new_socket,buffer,sizeof(buffer)); //printf("ret size is %d,msg is %s\n",read_ret,buffer); std::cout<<"rer size is "<<read_ret<<"msg from client is"<<buffer<<std::endl; //发送消息 std::cout<<"send msg\n"; std::string send_msg = "hello client,this is service"; send(new_socket,send_msg.c_str(),send_msg.size(),0); //关闭连接 usleep(5000*1000); std::cout<<"close socket\n"; close(new_socket); close(service_fd); return 1; }
这里额外介绍下设置地址这块:struct sockaddr_in service_addr:
2.客户端:
客户端的代码的过程如下:
1.创建socket。socket()
2.设置地址。struct sockaddr_in service_addr;
3.链接。connect()
4.收发消息。read()/send()
5.关闭链接。close()
客户端的完整代码如下->client_socket:
#include<iostream> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<string> int main(){ int client_fd; struct sockaddr_in client_addr; char buffer[1024]; //创建socket std::cout<<"Creating socket..."<<std::endl; client_fd = socket(AF_INET,SOCK_STREAM,0); if(client_fd < 0){ std::cout<<"creator socket failed\n"; return 1; } //设置地址 client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); client_addr.sin_port = htons(8080); //链接 std::cout<<"connect service\n"; int conncet_ret = connect(client_fd,(struct sockaddr*)&client_addr,sizeof(client_addr)); if(conncet_ret < 0){ std::cout<<"connect failed\n"; return 1; } //发送消息 std::cout<<"send message\n"; std::string send_msg = "hello,server,this is client"; send(client_fd,send_msg.c_str(),send_msg.length(),0); //接收消息 std::cout<<"get message\n"; int read_ret = read(client_fd,buffer,sizeof(buffer)); std::cout<<"read_ret is "<<read_ret<<"get msg is "<<buffer<<std::endl; //关闭socket std::cout<<"close socket\n"; close(client_fd); }
3.运行结果:
注意下这里是先运行服务端service_socket,这里的成果物都是要自己编译下才会生成的。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129823.html