当前位置:网站首页>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
边栏推荐
- Some thoughts on whether the judgment point is located in the contour
- 整理混乱的头文件,我用include what you use
- LeetCode第300场周赛(20220703)
- OpenCV的二值化处理函数threshold()详解
- node_exporter部署
- MySQL数据库基本操作-DDL | 黑马程序员
- In flinksql, in addition to data statistics, is the saved data itself a state
- 用实际例子详细探究OpenCV的轮廓绘制函数drawContours()
- 1008 Elevator(20 分)(PAT甲级)
- Unity给自己的脚本添加类似编辑器扩展的功能案例ContextMenu的使用
猜你喜欢

There are multiple divs in the large div, which are displayed on the same line. After overflow, scroll bars are generated without line breaks

Pytorch学习(四)

Bi skills - permission axis

Online text line fixed length fill tool

YOLOv5s-ShuffleNetV2

一文掌握数仓中auto analyze的使用

Lenovo explains in detail the green smart city digital twin platform for the first time to solve the difficulties of urban dual carbon upgrading

Use canal and rocketmq to listen to MySQL binlog logs

LeetCode第300场周赛(20220703)

性能优化之关键渲染路径
随机推荐
The page element is vertically and horizontally centered, realizing the vertical and horizontal centering of known or unknown width.
The 15th youth informatics competition in Shushan District in 2019
BI技巧丨权限轴
Opencv functions and methods related to binary threshold processing are summarized for comparison and use
26. Delete the duplicate item C solution in the ordered array
How test engineers "attack the city" (Part 2)
Explore the contour drawing function drawcontours() of OpenCV in detail with practical examples
Upgrade the smart switch, how much is the difference between the "zero fire version" and "single fire" wiring methods?
Go微服务(二)——Protobuf详细入门
Pytorch学习(四)
牛客小白月赛7 F题
LeetCode FizzBuzz C#解答
26. 删除有序数组中的重复项 C#解答
QT realizes interface sliding switching effect
HDU 1372 & POJ 2243 Knight Moves(广度优先搜索)
. Net ORM framework hisql practice - Chapter 2 - using hisql to realize menu management (add, delete, modify and check)
Wireshark网络抓包
Shell 编程核心技术《一》
Is the securities account opened by qiniu safe?
Online text line fixed length fill tool