当前位置:网站首页>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
边栏推荐
- There are multiple divs in the large div, which are displayed on the same line. After overflow, scroll bars are generated without line breaks
- 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
- 26. Delete the duplicate item C solution in the ordered array
- English语法_名词 - 使用
- 1008 Elevator(20 分)(PAT甲级)
- ftp、sftp文件传输
- 1006 Sign In and Sign Out(25 分)(PAT甲级)
- The page element is vertically and horizontally centered, realizing the vertical and horizontal centering of known or unknown width.
- Leetcode ransom letter C # answer
- LeetCode FizzBuzz C#解答
猜你喜欢

"Only one trip", active recommendation and exploration of community installation and maintenance tasks
redis分布式锁的8大坑总结梳理

SSRS筛选器的IN运算(即包含于)用法

Online text line fixed length fill tool

One question per day (2022-07-02) - Minimum refueling times

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?

Introduction to polyfit software

mysql中explain语句查询sql是否走索引,extra中的几种类型整理汇总

How to use async Awati asynchronous task processing instead of backgroundworker?
随机推荐
node_exporter部署
Is it safe to open an account at Great Wall Securities? How to open an account when buying stocks
使用canal配合rocketmq监听mysql的binlog日志
牛客小白月赛7 F题
Detailed explanation of issues related to SSL certificate renewal
Lm10 cosine wave homeopathic grid strategy
用实际例子详细探究OpenCV的轮廓绘制函数drawContours()
prometheus安装
Technologie de base de la programmation Shell IV
SSL证书续费相关问题详解
建立自己的网站(15)
Shell 编程核心技术《四》
The latest progress of Intel Integrated Optoelectronics Research promotes the progress of CO packaging optics and optical interconnection technology
Summary and sorting of 8 pits of redis distributed lock
BI技巧丨权限轴
1003 Emergency(25 分)(PAT甲级)
Build your own website (15)
牛客小白月赛7 I 新建 Microsoft Office Word 文档
LeetCode第300场周赛(20220703)
How test engineers "attack the city" (Part I)