蚊子132 開始實現支援LINUX系統

2021-06-22 04:36:07 字數 4719 閱讀 8039

為了得到更多使用者使用,蚊子132開始實現支援linux系統,下面寫一些開發筆記。

一、基本socket函式

linux系統是通過提供套接字(socket)來進行網路程式設計的。網路的socket資料傳輸是一種特殊的i/o,socket也是一種檔案描述符。socket也有乙個類似於打

開檔案的函式:socket(),呼叫socket(),該函式返回乙個整型的socket的描述符,隨後的連線建立、資料傳輸等操作也都是通過該socket實現。

1、socket函式

syntax:

int socket(int domain, int type, int protocol);

功能說明:

呼叫成功,返回socket檔案描述符;失敗,返回-1,並設定errno

引數說明:

domain指明所使用的協議族,通常為pf_inet,表示tcp/ip協議;

type引數指定socket的型別,基本上有三種:資料流套接字、資料報套接字、原始套接字

protocol通常賦值"0"。

兩個網路程式之間的乙個網路連線包括五種資訊:通訊協議、本地協議位址、本地主機埠、遠端主機位址和遠端協議埠。socket資料結構中包含這五種資訊。

2、bind函式

syntax:  

int bind(int sock_fd,struct sockaddr_in *my_addr, int addrlen);

功能說明:

將套接字和指定的埠相連。成功返回0,否則,返回-1,並置errno.

引數說明:

sock_fd是呼叫socket函式返回值,

my_addr是乙個指向包含有本機ip位址及埠號等資訊的sockaddr型別的指標;

struct sockaddr_in結構型別是用來儲存socket資訊的:

struct sockaddr_in ;

addrlen為sockaddr的長度。

3、connect函式

syntax:  

int connect(int sock_fd, struct sockaddr *serv_addr,int addrlen);

功能說明:

客戶端傳送服務請求。成功返回0,否則返回-1,並置errno。

引數說明:

sock_fd 是socket函式返回的socket描述符;serv_addr是包含遠端主機ip位址和埠號的指標;addrlen是結構sockaddr_in的長度。

4、listen函式

syntax:

int listen(int sock_fd, int backlog);

功能說明:

等待指定的埠的出現客戶端連線。呼叫成功返回0,否則,返回-1,並置errno.

引數說明:

sock_fd 是socket()函式返回值;

backlog指定在請求佇列中允許的最大請求數

5、accecpt函式

syntax:  

int accept(int sock_fd, struct sockadd_in* addr, int addrlen);

功能說明:

用於接受客戶端的服務請求,成功返回新的套接字描述符,失敗返回-1,並置errno。

引數說明:

sock_fd是被監聽的socket描述符,

addr通常是乙個指向sockaddr_in變數的指標,

addrlen是結構sockaddr_in的長度。

6、write函式

syntax:

ssize_t write(int fd,const void *buf,size_t nbytes)

功能說明:

write函式將buf中的nbytes位元組內容寫入檔案描述符fd.成功時返回寫的位元組數.失敗時返回-1. 並設定errno變數.

在網路程式中,當我們向套接字檔案描述符寫時有倆種可能:

1)write的返回值大於0,表示寫了部分或者是全部的資料.

2)返回的值小於0,此時出現了錯誤.需要根據錯誤型別來處理.

如果錯誤為eintr表示在寫的時候出現了中斷錯誤.

如果錯誤為epipe表示網路連線出現了問題.

7、read函式

syntax:

ssize_t read(int fd,void *buf,size_t nbyte)

函式說明:

read函式是負責從fd中讀取內容.當讀成功時,read返回實際所讀的位元組數,如果返回的值是0 表示已經讀到檔案的結束了,小於0表示出現了錯誤.

如果錯誤為eintr說明讀是由中斷引起的,

如果錯誤是econnrest表示網路連線出了問題.

8、close函式

syntax:

int close(sock_fd);

說明:當所有的資料操作結束以後,你可以呼叫close()函式來釋放該socket,從而停止在該socket上的任何資料操作:

函式執行成功返回0,否則返回-1

二、socket程式設計的其他函式說明

1、 網路位元組順序及其轉換函式

1) 網路位元組順序

每一台機器內部對變數的位元組儲存順序不同,而網路傳輸的資料是一定要統一順序的。所以對內部位元組表示順序與網路位元組順序不同的機器,

一定要對資料進行轉換,從程式的可移植性要求來講,就算本機的內部位元組表示順序與網路位元組順序相同也應該在傳輸資料以前先呼叫資料轉換函式,

以便程式移植到其它機器上後能正確執行。真正轉換還是不轉換是由系統函式自己來決定的。

2) 有關的轉換函式

* unsigned short int htons(unsigned short int hostshort):

主機位元組順序轉換成網路位元組順序,對無符號短型進行操作4bytes

* unsigned long int htonl(unsigned long int hostlong):

主機位元組順序轉換成網路位元組順序,對無符號長型進行操作8bytes

* unsigned short int ntohs(unsigned short int netshort):

網路位元組順序轉換成主機位元組順序,對無符號短型進行操作4bytes

* unsigned long int ntohl(unsigned long int netlong):

網路位元組順序轉換成主機位元組順序,對無符號長型進行操作8bytes

注:以上函式原型定義在netinet/in.h裡

2、ip位址轉換

有三個函式將數字點形式表示的字串ip位址與32位網路位元組順序的二進位制形式的ip位址進行轉換

(1) unsigned long int inet_addr(const char * cp):該函式把乙個用數字和點表示的ip位址的字串轉換成乙個無符號長整型,如:struct sockaddr_in ina

ina.sin_addr.s_addr=inet_addr("202.206.17.101")

該函式成功時:返回轉換結果;失敗時返回常量inaddr_none,該常量=-1,二進位制的無符號整數-1相當於255.255.255.255,這是乙個廣播位址,所以在程式中呼叫iner_addr()時,一定要人為地對呼叫失敗進行處理。由於該函式不能處理廣播位址,所以在程式中應該使用函式inet_aton()。

(2)int inet_aton(const char * cp,struct in_addr * inp):此函式將字串形式的ip位址轉換成二進位制形式的ip位址;成功時返回1,否則返回0,轉換後的ip位址儲存在引數inp中。

(3) char * inet_ntoa(struct in-addr in):將32位二進位制形式的ip位址轉換為數字點形式的ip位址,結果在函式返回值中返回,返回的是乙個指向字串的指標。

3、位元組處理函式

socket位址是多位元組資料,不是以空字元結尾的,這和c語言中的字串是不同的。linux提供了兩組函式來處理多位元組資料,一組以b(byte)開頭,是和bsd系統相容的函式,另一組以mem(記憶體)開頭,是ansi c提供的函式。

以b開頭的函式有:

(1) void bzero(void * s,int n):將引數s指定的記憶體的前n個位元組設定為0,通常它用來將套接字位址清0。

(2) void bcopy(const void * src,void * dest,int n):從引數src指定的記憶體區域拷貝指定數目的位元組內容到引數dest指定的記憶體區域。

(3) int bcmp(const void * s1,const void * s2,int n):比較引數s1指定的記憶體區域和引數s2指定的記憶體區域的前n個位元組內容,如果相同則返回0,否則返回非0。

注:以上函式的原型定義在strings.h中。

以mem開頭的函式有:

(1) void * memset(void * s,int c,size_t n):將引數s指定的記憶體區域的前n個位元組設定為引數c的內容。

(2) void * memcpy(void * dest,const void * src,size_t n):功能同bcopy(),區別:函式bcopy()能處理引數src和引數dest所指定的區域有重疊的情況,memcpy()則不能。

(4) int memcmp(const void * s1,const void * s2,size_t n):比較引數s1和引數s2指定區域的前n個位元組內容,如果相同則返回0,否則返回非0。

注:以上函式的原型定義在string.h中。

二、程式說明

佛系老年學量化 從實現指標開始(ADTM)

一 指標說明 adtm指標 動態買賣氣指標,指標解釋來自mba智庫百科 動態買賣氣指標 adtm 是用開盤價的向上波動幅度和向下波動幅度的距離差值來描述人氣高低的指標。計算公式 通達信 dtm if open ref open,1 0,max high open open ref open,1 db...

配置Linux核心支援yaffs2檔案系統

2.進入yaffs2目錄,執行patch ker.sh指令碼,將檔案複製到linux核心的fs目錄下。cd yaffs2 patch ker.sh c m work linux 3.10.4 輸出如下資訊,表明指令碼執行成功。updating home yuntaohe work linux 3.1...

Linux準備開始支援SD卡新規範的電源 效能特性

自從sd卡規www.cppcns.com格v4.0發表以來,就有了擴充套件暫存器的概念,最初用於電源管理功能,在sd v6.0規格中,現在也用於效能功能。而linuxzmmualbx核心終於也計畫開始相容這些sd擴充套件暫存器了。linaro的ulf hansson本週發出了補丁,這讓linux核心...