当前位置:网站首页>socket编程demo二
socket编程demo二
2022-07-04 18:01:00 【会飞的胖达喵】
1、创建main.cpp
#include <stdlib.h>
#include "XTcp.h"
#include <thread>
#include <string.h>
class TcpThread {
public:
void Main() {
//windows 是没有read的
char buf[1024] = {
0 };
while (true) {
int recvlen = clientFd.Recv( buf, sizeof(buf) - 1);// fd buffer 大小 flag
if (recvlen <= 0) {
break;
}
buf[recvlen] = '\n';
if (strstr(buf, "quit") != NULL) {
char re[] = "quit success!\n";
clientFd.Send(re, strlen(re) + 1);
printf("exit;");
break;
}
int sendlen = clientFd.Send( "ok\n", 3);
// recv/send都不能保证一定能接受或者发送完所有的数据
printf("sendlen:%d\n", sendlen);
printf("recv %s\n", buf);
}
clientFd.Close();
delete this;
}
XTcp clientFd;
};
int main(int argc, char* argv[]) {
unsigned short port = 8080;
if (argc > 1) {
port = atoi(argv[1]);//读取命令行参数
}
XTcp server;
server.CreateSocket();
server.Bind(port);
for (;;) {
XTcp client = server.Accept();
TcpThread* th = new TcpThread;
th->clientFd = client;
std::thread sth(&TcpThread::Main, th);
sth.detach();//主线程释放主线程拥有的子线程的资源释放掉,业务逻辑交给子线程
}
server.Close();
//char c = getchar();
return 0;
}
2、创建XTcp.h
#pragma once
#include <string>
class XTcp
{
public:
int CreateSocket();
bool Bind(unsigned short port);
XTcp Accept();
void Close();
int Recv(char *buf,int bufsize);
int Send(const char *buf,int bufsize);
XTcp();
virtual ~XTcp();
int socketFd = 0;
unsigned short port = 0;
std::string ip;
};
3、创建XTcp.cpp
#include "XTcp.h"
#include<stdio.h>
#include <string.h>
#ifdef _WIN64
#include<ws2tcpip.h>
#include<Windows.h>
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#define closesocket close
#endif
#include <thread>
using namespace std;
XTcp::XTcp() {
#ifdef _WIN64
static bool first = true;
if (first) {
first = false;
WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);
}
#endif
}
int XTcp::CreateSocket() {
// 导致绑定错误
//int socketFd = socket(AF_INET, SOCK_STREAM, 0);
socketFd = socket(AF_INET, SOCK_STREAM, 0);
if (socketFd == -1) {
printf("created socket failed!\n");
return -1;
}
return socketFd;
}
bool XTcp::Bind(unsigned short port) {
if (socketFd == 0) {
CreateSocket();
}
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);//本地字节序转成网络字节序
saddr.sin_addr.s_addr = htonl(0);
int bindRes = ::bind(socketFd, (sockaddr*)&saddr, sizeof(saddr));
if (bindRes != 0) {
printf("bind port %d failed!\n", port);
return false;
}
printf("bind port %d success!\n", port);
listen(socketFd, 10);//10个链接的队列,等待accept处理的队列最大等待队列
return true;
}
XTcp XTcp::Accept() {
XTcp tcp;
sockaddr_in caddr;
//int len = 0;
socklen_t len = sizeof(caddr);
int clientFd = accept(socketFd, (sockaddr*)&caddr, &len);// 对应请求client的socketFd,可以用来读取对应client的数据
if (clientFd < 0) return tcp;
printf("accept client %d\n", clientFd);
tcp.ip = inet_ntoa(caddr.sin_addr); //转成字符串
tcp.port = ntohs(caddr.sin_port);
tcp.socketFd = clientFd;
printf("client ip is %s,port is %d \n", tcp.ip.c_str(), tcp.port);
return tcp;
}
void XTcp::Close() {
if (socketFd <= 0) {
closesocket(socketFd);
}
};
int XTcp::Recv(char* buf, int bufsize) {
return recv(socketFd, buf, bufsize, 0);
}
int XTcp::Send(const char* buf, int bufsize) {
int slen = 0;
while (slen != 0) {
int len = send(socketFd, buf + slen, bufsize - slen, 0);
if (len <= 0) {
break;
}
slen += len;
}
return slen;
}
XTcp::~XTcp() {
}
4、创建makefile文件
tcpserver:main.cpp XTcp.cpp XTcp.h
g++ XTcp.cpp main.cpp -o tcpserver -std=c++11 -lpthread
5、执行make
sudo make
6、启动服务端
./tcpserver
7、测试连接
telnet 192.168.3.15 8080
边栏推荐
- 反射(一)
- Guys, for help, I use MySQL CDC 2.2.1 (Flink 1.14.5) to write Kafka and set
- SSL证书续费相关问题详解
- Shell 编程核心技术《一》
- 国元期货是正规平台吗?在国元期货开户安全吗?
- 读写关闭的channel是啥后果?
- [release] a tool for testing WebService and database connection - dbtest v1.0
- LeetCode FizzBuzz C#解答
- Master the use of auto analyze in data warehouse
- The CDC of sqlserver can read the data for the first time, but it can't read the data after adding, deleting and modifying. What's the reason
猜你喜欢
读写关闭的channel是啥后果?
如何使用Async-Awati异步任務處理代替BackgroundWorker?
Go microservice (II) - detailed introduction to protobuf
2022CoCa: Contrastive Captioners are Image-Text Fountion Models
Detailed explanation of the binary processing function threshold() of opencv
整理混乱的头文件,我用include what you use
Summary and sorting of 8 pits of redis distributed lock
在线SQL转Excel(xls/xlsx)工具
Introduction to polyfit software
MySQL数据库基本操作-DDL | 黑马程序员
随机推荐
.NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)
C # implementation defines a set of SQL statements that can be executed across databases in the middle of SQL (detailed explanation of the case)
国元期货是正规平台吗?在国元期货开户安全吗?
Cache é JSON uses JSON adapters
Detailed explanation of issues related to SSL certificate renewal
生成XML元素
PolyFit软件介绍
Online text line fixed length fill tool
英特尔集成光电研究最新进展推动共封装光学和光互连技术进步
Oracle with as ORA-00903: invalid table name 多表报错
1007 Maximum Subsequence Sum(25 分)(PAT甲级)
YOLOv5s-ShuffleNetV2
1672. Total assets of the richest customers
Pointnet/Pointnet++点云数据集处理并训练
OpenCV的二值化处理函数threshold()详解
BI技巧丨权限轴
How test engineers "attack the city" (Part I)
FPGA时序约束分享01_四大步骤简述
Shell programming core technology "I"
Build your own website (15)