当前位置:网站首页>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
边栏推荐
- How to use async Awati asynchronous task processing instead of backgroundworker?
- 大div中有多个div,这些div在同一行显示,溢出后产生滚动条而不换行
- 偏移量函数及开窗函数
- Shell 编程核心技术《四》
- 请教一下 flinksql中 除了数据统计结果是状态被保存 数据本身也是状态吗
- Safer, smarter and more refined, Chang'an Lumin Wanmei Hongguang Mini EV?
- 1002. A+B for Polynomials (25)(PAT甲级)
- 函数式接口
- In flinksql, in addition to data statistics, is the saved data itself a state
- The kth largest element in the array
猜你喜欢
随机推荐
Lenovo explains in detail the green smart city digital twin platform for the first time to solve the difficulties of urban dual carbon upgrading
Unity adds a function case similar to editor extension to its script, the use of ContextMenu
Allure of pytest visual test report
Generate XML elements
SSL证书续费相关问题详解
To sort out messy header files, I use include what you use
Detailed explanation of issues related to SSL certificate renewal
PolyFit软件介绍
Shell programming core technology "I"
LeetCode 赎金信 C#解答
LeetCode FizzBuzz C#解答
Pointnet/Pointnet++点云数据集处理并训练
Pytest 可视化测试报告之 Allure
《看完就懂系列》字符串截取方法substr() 、 slice() 和 substring()之间的区别和用法
FPGA timing constraint sharing 01_ Brief description of the four steps
The page element is vertically and horizontally centered, realizing the vertical and horizontal centering of known or unknown width.
牛客小白月赛7 E Applese的超能力
1011 World Cup Betting (20 分)(PAT甲级)
基于NCF的多模块协同实例
Detailed explanation of the binary processing function threshold() of opencv








