当前位置:网站首页>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
边栏推荐
- Shell 编程核心技术《二》
- 1672. 最富有客户的资产总量
- 勾股数规律(任意三个数能够满足勾股定理需要满足的条件)
- SSRS筛选器的IN运算(即包含于)用法
- 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
- socket编程demo二
- HDU 1372 & POJ 2243 Knight Moves(广度优先搜索)
- The 15th youth informatics competition in Shushan District in 2019
- Generate XML elements
- Is it safe to open an account at Great Wall Securities? How to open an account when buying stocks
猜你喜欢
Summary and sorting of 8 pits of redis distributed lock

“只跑一趟”,小区装维任务主动推荐探索

Wireshark网络抓包
![[uniapp] uniapp development app online Preview PDF file](/img/11/d640338c626249057f7ad616b55c4f.png)
[uniapp] uniapp development app online Preview PDF file

Lm10 cosine wave homeopathic grid strategy

Pointnet/Pointnet++点云数据集处理并训练

To sort out messy header files, I use include what you use

PointNeXt:通过改进的模型训练和缩放策略审视PointNet++
redis分布式锁的8大坑总结梳理

mysql中explain语句查询sql是否走索引,extra中的几种类型整理汇总
随机推荐
Introduction to polyfit software
[release] a tool for testing WebService and database connection - dbtest v1.0
反射(一)
The latest progress of Intel Integrated Optoelectronics Research promotes the progress of CO packaging optics and optical interconnection technology
YOLOv5s-ShuffleNetV2
Unity editor extends C to traverse all pictures in folders and subdirectories
876. 链表的中间结点
读写关闭的channel是啥后果?
问下各位大佬有用过cdc直接mysql to clickhouse的么
添加命名空间声明
How to use async Awati asynchronous task processing instead of backgroundworker?
Shell programming core technology "I"
Is Guoyuan futures a regular platform? Is it safe to open an account in Guoyuan futures?
Allure of pytest visual test report
安徽 中安在线文旅频道推出“跟着小编游安徽”系列融媒体产品
Unity adds a function case similar to editor extension to its script, the use of ContextMenu
An example of multi module collaboration based on NCF
node_exporter部署
Comment utiliser async awati asynchrone Task Handling au lieu de backgroundworker?
1011 World Cup Betting (20 分)(PAT甲级)