封裝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í)行
成功并發(fā),多個客戶端
封裝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)