本文是我在学习socket通信中自己写的一些程序和代码,之后还会持续更新。
yzz_client.cpp
#include"yzz_client.h"
TcpClient::TcpClient(std::string ip,int port){
if((connect_fd = socket(AF_INET,SOCK_STREAM,0)) == 0)
return;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
hostent* h = gethostbyname(ip.data());
memcpy(&server_addr.sin_addr,h -> h_addr,h -> h_length);
}
int TcpClient::Connect(){
if(connect(connect_fd,(sockaddr*)&server_addr,sizeof(server_addr)) != 0){
close(connect_fd);
return 1;
}
printf("已连接到服务端%s\n",inet_ntoa(server_addr.sin_addr));
}
int TcpClient::Send(std::string& buffer){
int len = send(connect_fd,buffer.data(),buffer.size(),0);
if(len <= 0){
printf("发送错误\n");
}
else{
printf("已发送:\n%s\n",buffer.data());
}
return len;
}
int TcpClient::Recv(std::string& buffer){
char Buffer[1001];
memset(Buffer,0,sizeof(Buffer));
int len = recv(connect_fd,Buffer,sizeof(Buffer),0);
if(len <= 0){
printf("接收错误\n");
}
else{
buffer = Buffer;
}
return len;
}
TcpClient::~TcpClient(){
if(connect_fd >= 0)
close(connect_fd);
}
yzz_client.h
#include<bits/stdc++.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<netdb.h>
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/document.h"
#include "rapidjson/prettywriter.h"
using namespace std;
class TcpClient{
private:
struct sockaddr_in server_addr;
int connect_fd;
public:
TcpClient(std::string ip,int port);
int Connect();
int Read();
int Write();
int Send(std::string&);
int Recv(std::string&);
~TcpClient();
};
yzz_server.cpp
#include"yzz_server.h"
using namespace std;
TcpServer::TcpServer(int port){
if((listen_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
return;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
}
TcpServer::TcpServer(std::string ip,int port){
if((listen_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
return;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ip.data());
server_addr.sin_port = htons(port);
}
int TcpServer::Bind(){
if(bind(listen_fd,(sockaddr *)&server_addr,sizeof(server_addr)) != 0){
close(listen_fd);
return 1;
}
printf("服务端%s 已处于监听模式\n",inet_ntoa(server_addr.sin_addr));
return 0;
}
int TcpServer::Listen(int queue_len){
if(listen(listen_fd,queue_len) != 0){
close(listen_fd);
return 1;
}
return 0;
}
int TcpServer::Accept(){
int socklen = sizeof(sockaddr_in);
connect_fd = accept(listen_fd,(sockaddr *)&client_addr,(socklen_t *)&socklen);
printf("客户端%s 已连接\n",inet_ntoa(client_addr.sin_addr));
return 0;
}
int TcpServer::Send(std::string& buffer){
int len = 0;
len = send(connect_fd,buffer.data(),buffer.size(),0);
if(len <= 0){
printf("发送错误\n");
}
else {
printf("已发送:\n%s\n",buffer.data());
}
return len;
}
int TcpServer::Recv(std::string& buffer){
char Buffer[1001];
memset(Buffer,0,sizeof(Buffer));
int len = recv(connect_fd,Buffer,sizeof(Buffer),0);
if(len <= 0){
printf("接收错误\n");
}
else{
buffer = Buffer;
}
return len;
}
TcpServer::~TcpServer(){
if(listen_fd >= 0)
close(listen_fd);
if(connect_fd >= 0)
close(connect_fd);
}
yzz_server.h
#include<bits/stdc++.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<netdb.h>
#include<string>
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
using namespace std;
class TcpServer{
private:
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int listen_fd;
int connect_fd;
public:
TcpServer(std::string ip,int port);
TcpServer(int port);
int Listen(int queue_len = 10);//将服务端置于监听状态
int Bind();//绑定服务端和它的端口
int Accept();//和客户端建立链接
int Read();//接收信息
int Write();//发送信息
int Send(std::string&);
int Recv(std::string&);
~TcpServer();
};