这篇文章不详细说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:
sin_family:表示地址族,通常为AF_INET(IPv4)
sin_port:表示端口号,使用无符号短整型表示,范围为0到65535
sin_addr:是一个"struct in_addr"类型的结构体,用于表示IPv4地址。
sin_zero:是一些填充字节,用于使得sockaddr_in。
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,这里的成果物都是要自己编译下才会生成的。