当前位置:网站首页>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
边栏推荐
- The latest progress of Intel Integrated Optoelectronics Research promotes the progress of CO packaging optics and optical interconnection technology
- Shell 編程核心技術《四》
- Shell 编程核心技术《二》
- 爬虫(6) - 网页数据解析(2) | BeautifulSoup4在爬虫中的使用
- prometheus安装
- Have you guys ever used CDC direct Mysql to Clickhouse
- How to use async Awati asynchronous task processing instead of backgroundworker?
- Bi skills - permission axis
- 升级智能开关,“零火版”、“单火”接线方式差异有多大?
- Online text line fixed length fill tool
猜你喜欢
千万不要只学 Oracle、MySQL!
一文掌握数仓中auto analyze的使用
BI技巧丨权限轴
【问题】druid报异常sql injection violation, part alway true condition not allow 解决方案
FPGA时序约束分享01_四大步骤简述
如何使用Async-Awati异步任務處理代替BackgroundWorker?
欧拉函数
To sort out messy header files, I use include what you use
PointNeXt:通过改进的模型训练和缩放策略审视PointNet++
Hough transform Hough transform principle
随机推荐
The latest progress of Intel Integrated Optoelectronics Research promotes the progress of CO packaging optics and optical interconnection technology
关于判断点是否位于轮廓内的一点思考
Comment utiliser async awati asynchrone Task Handling au lieu de backgroundworker?
SSRS筛选器的IN运算(即包含于)用法
Lm10 cosine wave homeopathic grid strategy
Unity editor extends C to traverse all pictures in folders and subdirectories
ftp、sftp文件传输
Shell 编程核心技术《一》
876. Intermediate node of linked list
The 15th youth informatics competition in Shushan District in 2019
Summary and sorting of 8 pits of redis distributed lock
【问题】druid报异常sql injection violation, part alway true condition not allow 解决方案
Nebula importer data import practice
Is the securities account opened by qiniu safe?
English语法_名词 - 使用
2021 Hefei informatics competition primary school group
2014合肥市第三十一届青少年信息学奥林匹克竞赛(小学组)试题
自由小兵儿
OpenCV的二值化处理函数threshold()详解
大佬们,求助一下,我用mysql cdc 2.2.1(flink 1.14.5)写入kafka,设置