socket動態庫專案

XX風發表於2021-01-02

XSocket.h

class XSocket
{
public:
	bool Bind(unsigned short port);
protected:
	int sock = 0;
};

XSocket.cpp

#include "XSocket.h"
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>//標頭檔案中儘量不要引用,以後要做跨平臺應用,不同平臺的標頭檔案引用可能不一樣.h檔案就變得不通用了
#include <iostream>
using namespace std;

XSocket::Bind(unsigned short port)
{
	if(this->sock){
		close(this->sock);//每次建立的時候先進行釋放
	}

	//建立連結,三次握手的資訊會存在這裡,當讀這個socked的時候會獲取與使用者建立的連結
	this->sock = socked(AF_INET,SOCK_STREAM,0);//獲取檔案id,win裡面的控制程式碼
	
	if(this->sock <= 0 ){
		cout << "creat socket faild.(可能資源用盡)" << endl;
		return false;
	}
	
	//bing->地址填充(協議、IP、port),告訴系統ip+port的資料與某一個socked關聯並寫到寫個socked檔案中
	sockaddr_in saddr;
	saddr.sin_family = AF_INET;//協議型別
	saddr.sin_port = htons(port);//轉換為網路傳輸位元組序
	saddr.sin_addr.s_addr = htonl(0);//long,0表示任何地址都接受
	int re = bind(sock,(sockaddr*)&saddr,sizeof(saddr));//c語言沒有過載,只能通過同一個介面sockaddr,需要強轉不同型別,最後通過size來判斷繫結的是什麼型別
	
	if(re == -1){
	cout << "bing faild." << endl;
	return false;
	}
	
	//以上只是告訴,但是並沒有開始寫,從listen開始發過來的資料開始寫
	listen(sock,100);//引數2:未完成佇列的大小,非併發數量,理解為快取最多放多少個,一瞬間能夠處理的數量,假設100,但是進來了1000,還有900個都會被扔掉:https://www.cnblogs.com/ztteng/p/5147156.html

	cout << "bing port" << port << "success" << endl;

	return true;
}

makefile

OUT=libxsocket.so
CC=$(g++)
$(OUT):XSocket.cpp XSocket.h
	$(CC) $+ -O $@ -shared -fPIC -g -std=c++11#c++11之前類中的成員變數不能賦初值,只能在建構函式中

相關文章