当前位置:网站首页>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
边栏推荐
- 2014合肥市第三十一届青少年信息学奥林匹克竞赛(小学组)试题
- 876. Intermediate node of linked list
- Go microservice (II) - detailed introduction to protobuf
- “只跑一趟”,小区装维任务主动推荐探索
- Pytest 可视化测试报告之 Allure
- Unity给自己的脚本添加类似编辑器扩展的功能案例ContextMenu的使用
- MySQL数据库基本操作-DDL | 黑马程序员
- Unity editor extends C to traverse all pictures in folders and subdirectories
- Technology sharing | interface testing value and system
- 页面元素垂直水平居中、实现已知或者未知宽度的垂直水平居中。
猜你喜欢
随机推荐
线上数据库迁移的几种方法
mysql中explain语句查询sql是否走索引,extra中的几种类型整理汇总
函数式接口
Guys, for help, I use MySQL CDC 2.2.1 (Flink 1.14.5) to write Kafka and set
Technologie de base de la programmation Shell IV
Hough transform Hough transform principle
Qt实现界面滑动切换效果
1672. 最富有客户的资产总量
From automation to digital twins, what can Tupo do?
Oracle with as ora-00903: invalid table name multi report error
Lenovo explains in detail the green smart city digital twin platform for the first time to solve the difficulties of urban dual carbon upgrading
The page element is vertically and horizontally centered, realizing the vertical and horizontal centering of known or unknown width.
Safer, smarter and more refined, Chang'an Lumin Wanmei Hongguang Mini EV?
To sort out messy header files, I use include what you use
偏移量函数及开窗函数
How to use async Awati asynchronous task processing instead of backgroundworker?
redis分布式锁的8大坑总结梳理
HDU 1097 A hard puzzle
There are multiple divs in the large div, which are displayed on the same line. After overflow, scroll bars are generated without line breaks
Comment utiliser async awati asynchrone Task Handling au lieu de backgroundworker?