当前位置:网站首页>Socket programming demo II
Socket programming demo II
2022-07-04 19:34:00 【Fat Da meow who can fly】
1、 establish main.cpp
#include <stdlib.h>
#include "XTcp.h"
#include <thread>
#include <string.h>
class TcpThread {
public:
void Main() {
//windows It's not read Of
char buf[1024] = {
0 };
while (true) {
int recvlen = clientFd.Recv( buf, sizeof(buf) - 1);// fd buffer size 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 There is no guarantee that all data will be received or sent
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]);// Read the command line arguments
}
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();// The main thread releases the resources of the sub threads owned by the main thread , The business logic is handed over to the child thread
}
server.Close();
//char c = getchar();
return 0;
}
2、 establish 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、 establish 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() {
// Cause binding error
//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);// Convert local byte order to network byte order
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 Linked queues , wait for accept The maximum waiting queue for processing
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);// Corresponding request client Of socketFd, Can be used to read the corresponding client The data of
if (clientFd < 0) return tcp;
printf("accept client %d\n", clientFd);
tcp.ip = inet_ntoa(caddr.sin_addr); // Convert to string
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、 establish makefile file
tcpserver:main.cpp XTcp.cpp XTcp.h
g++ XTcp.cpp main.cpp -o tcpserver -std=c++11 -lpthread
5、 perform make
sudo make
6、 Start server
./tcpserver
7、 Test connection
telnet 192.168.3.15 8080
边栏推荐
- Wireshark网络抓包
- Oracle with as ORA-00903: invalid table name 多表报错
- 2021 合肥市信息学竞赛小学组
- OpenCV的二值化处理函数threshold()详解
- Mysql database basic operation -ddl | dark horse programmer
- .NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)
- SSRS筛选器的IN运算(即包含于)用法
- Is it safe to open an account at Great Wall Securities? How to open an account when buying stocks
- 牛客小白月赛7 F题
- English语法_名词 - 使用
猜你喜欢
[uniapp] uniapp development app online Preview PDF file
Detailed explanation of the binary processing function threshold() of opencv
Mysql database basic operation -ddl | dark horse programmer
使用canal配合rocketmq监听mysql的binlog日志
Lm10 cosine wave homeopathic grid strategy
整理混乱的头文件,我用include what you use
用实际例子详细探究OpenCV的轮廓绘制函数drawContours()
一文掌握数仓中auto analyze的使用
There are multiple divs in the large div, which are displayed on the same line. After overflow, scroll bars are generated without line breaks
Go microservice (II) - detailed introduction to protobuf
随机推荐
LeetCode FizzBuzz C#解答
26. 删除有序数组中的重复项 C#解答
Allure of pytest visual test report
Is Guoyuan futures a regular platform? Is it safe to open an account in Guoyuan futures?
SSRS筛选器的IN运算(即包含于)用法
欧拉函数
Specify the character set to output
从实时应用角度谈通信总线仲裁机制和网络流控
Shell programming core technology "four"
《工作、消费主义和新穷人》的微信读书笔记
The difference and usage between substr (), slice (), and substring () in the string interception methods of "understand series after reading"
Pytest 可视化测试报告之 Allure
牛客小白月赛7 谁是神箭手
Lm10 cosine wave homeopathic grid strategy
指定输出的字符集
线上数据库迁移的几种方法
English语法_名词 - 使用
MySQL数据库基本操作-DDL | 黑马程序员
Unity给自己的脚本添加类似编辑器扩展的功能案例ContextMenu的使用
Oracle with as ora-00903: invalid table name multi report error