成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C++socket網(wǎng)絡編程(跨平臺)實戰(zhàn)HTTP服務器(三)

             封裝TCP類

為田東等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及田東網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都做網(wǎng)站、網(wǎng)站設計、外貿營銷網(wǎng)站建設、田東網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

封裝一下tcp類, 步驟還可以簡化,

直接放上代碼類名:XTCP

xtcp.h

#ifndef _XTCP_H_
#define _XTCP_H_
#include <iostream>
#include <string.h>
class XTCP
{
public:
XTCP();
virtual ~XTCP();
public:
int CreateSocket();//創(chuàng)建socket 反悔socket
bool Bind(unsigned short port);//綁定端口
XTCP Accept();//反回一個對象
void Close();//關閉 主動做
int Recv(char *buf, int bufsize);//接收
int Send(const char *buf, int sendsize);//發(fā)送
int m_sock = 0;
unsigned short m_port = 0;
std::string ip;
};
#endif //_XTCP_H_

xtcp.cpp

#include "XTCP.h"
#ifdef WIN32
#include <Windows.h>
#define socklen_t int
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define closesocket close
#include <string.h>
#endif
XTCP::XTCP()
{
#ifdef WIN32
static bool first = true; //保證只進入一次
if (first)
{
first = false;
WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);
}
#endif
}
XTCP::~XTCP()
{
}
int XTCP::CreateSocket()
{
m_sock = socket(AF_INET, SOCK_STREAM, 0);
if (m_sock == -1)
{
printf("create socket failed!\n");
}
return m_sock;
}
bool  XTCP::Bind(unsigned short port)
{
sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
sa.sin_addr.s_addr = htonl(0);
if (bind(m_sock, (sockaddr*)&sa, sizeof(sa)))
{
printf("bind port err\n");
//綁定成功
return false;
}
//偵聽
listen(m_sock, 10);
//綁定失敗
return true;
}
void XTCP::Close()
{
if (m_sock <= 0) return;
closesocket(m_sock);
}
XTCP XTCP::Accept()
{
XTCP tcp;
sockaddr_in sadd;
socklen_t len = sizeof(sadd);
printf("lsiteb ... accept ok\n");
//這里會阻塞 只有等待有新的連接 才會執(zhí)行下面的代碼
int client = accept(m_sock, (sockaddr*)&sadd, &len);
//反悔判斷m_sock是否為0就行了
if (client <= 0)return tcp; 
printf("client connect ok\n");
//輸出端口號和信息
tcp.ip = inet_ntoa(sadd.sin_addr);
//網(wǎng)絡字節(jié)序轉本地字節(jié)序哦
tcp.m_port = ntohs(sadd.sin_port);
//記錄socket
tcp.m_sock = client;
printf("IP: %s:port: %d\n", tcp.ip.c_str(), tcp.m_port);
return tcp;
}
int XTCP::Recv(char *buf, int bufsize)
{
return recv(m_sock, buf, bufsize, 0);
}
int XTCP::Send(const char *buf, int sendsize)
{
//buf 必須發(fā)送制定大小   保證發(fā)送全部成功
int s = 0;  //以發(fā)送的  發(fā)送大小減去以及發(fā)送的
while (s != sendsize)
{
//反回就是發(fā)送的長度
int len = send(m_sock, buf + s, sendsize - s, 0);
if (len <= 0)
break;
s += len;  //加上發(fā)送的長度
}
return s;
}

測試代碼

#include "XTCP.h"
#include <thread>
class TcpThread
{
public:
//線程入口函數(shù) 創(chuàng)建一個
void Main()
{
char buf[1024];
for (;;)
{
memset(buf, 0, sizeof(buf));
int recv_len = client.Recv( buf, sizeof(buf) - 1);
if (recv_len <= 0)break;
if (strstr(buf, "quit") != NULL)
{
char re[] = "quit success\n";
int sendlen = client.Send(re, strlen(re) + 1);
break;
}
char *p_ok = "ok\n";
int sendlen = client.Send(p_ok,strlen(p_ok));
printf("recv %s\n", buf);
}
client.Close();
delete this;
}
//用戶的socket
XTCP client;
};


int main(int argc,char*argv[])
{
unsigned short port = 8016;
XTCP mytcp;
//創(chuàng)建
mytcp.CreateSocket();
//綁定
if (!mytcp.Bind(port))
return -1;
for (;;)
{
XTCP client = mytcp.Accept();
//創(chuàng)建線程
TcpThread *th = new TcpThread();
th->client = client;
std::thread sthr(&TcpThread::Main, th);
// 釋放主線程占用的資源
sthr.detach();
}
mytcp.Close();
getchar();
return 0;
}

原理就是: 創(chuàng)建一個對象XTCP server,有一個int變量,是用來記錄創(chuàng)建的socket.的,他用來和用戶建立連接,然后服務器必須要綁定端口,Bind里自動偵聽。(調用了listen函數(shù))

然后就是反回一個用戶client的XTCP對象,把這個對象賦值給上面

的線程類里的成員,應為他TcpThread*th = new TcpThread();

他里面有一個th->client = client; 把他賦值給這個client.

然后創(chuàng)建線程在線程里等待數(shù)據(jù)收發(fā), 這個new的對象 是在

線程函數(shù)里進行釋放的 也就是closesocket后面有一個delete this. ,最后就是th->detach() 是釋放主線程占用的子線程

的資源,。

移植到linux

先看下makefile

SRC 添加main.cpp 和 XTCP.cpp 就行了

CC=g++
SRC=main.cpp XTCP.cpp
OBJ=hello.o
EXEC=manc
start:
        $(CC) $(SRC) -o $(EXEC) -std=c++11 -lpthread
$(OBJ):
        $(CC)  $(OBJ) -c $(SRC)
clean:
        rm -f $(OBJ) $(EXEC)
run:
        ./$(EXEC)

執(zhí)行make start  編譯連接

執(zhí)行make run  執(zhí)行

C++socket網(wǎng)絡編程(跨平臺)實戰(zhàn)HTTP服務器(三)

成功并發(fā),多個客戶端

C++socket網(wǎng)絡編程(跨平臺)實戰(zhàn)HTTP服務器(三)

        封裝TCP類到Windowsd的dll動態(tài)庫

將一個類封裝到dll和linux的so

在這個博客里講:

    http://12158490.blog.51cto.com/12148490/1947885


網(wǎng)站標題:C++socket網(wǎng)絡編程(跨平臺)實戰(zhàn)HTTP服務器(三)
鏈接分享:http://jinyejixie.com/article30/ppicpo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、虛擬主機企業(yè)網(wǎng)站制作、網(wǎng)站維護、網(wǎng)站改版、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
吉木乃县| 集安市| 扶绥县| 大港区| 韩城市| 新郑市| 麻阳| 奉贤区| 河西区| 承德市| 青田县| 丰顺县| 苍山县| 虹口区| 花莲县| 齐河县| 佛学| 梧州市| 东阳市| 伽师县| 当阳市| 宽城| 兖州市| 牙克石市| 宜川县| 开封县| 渝北区| 西丰县| 凤阳县| 龙川县| 嵩明县| 正蓝旗| 河津市| 云霄县| 祁东县| 沈丘县| 濮阳县| 大丰市| 宝清县| 肥东县| 藁城市|