Socket的學習二

2022-06-17 10:06:11 字數 3144 閱讀 3909

af_unix實現本地通訊:

1.unix域的socket通訊及其優點

基於socket的框架上發展出一種ipc機制,就是unix domain socket。

),但是unix domain socket用於ipc 更有效率及可靠 :

不需要經過網路協議棧

不需要打包拆包、計算校驗和、維護序號和應答等,可靠性更強

unix domain socket傳輸效率比通過loopback位址快將近一倍

2.預備知識 

需要了解:

socket通訊基本概念

linux檔案操作函式

linux檔案操作函式:

read - 從檔案描述符裡讀取資料

方法:ssize_t read(int fd, void *buf, size_t count);

引數:fd:檔案描述符,對於本文而言是socket套接字

buf:緩衝區指標

count:預期讀取的位元組數

返回值:表示實際讀到的位元組數(字串結束符 '\0』不算)

write - 從檔案描述符裡寫入資料

函式定義:ssize_t write (int fd, const void * buf, size_t count);

函式說明:write()會把引數buf所指的記憶體寫入count個位元組到引數放到所指的檔案內。

返回值:如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤**存入errno中。

附件說明:

1.write()函式返回值一般無0,只有當如下情況發生時才會返回0:

write(fp, p1+len, (strlen(p1)-len)中第三引數為0,

此時write()什麼也不做,只返回0。man手冊給出的write()返回值的說明如下:

2.write()函式從buf寫資料到fd中時,若buf中資料無法一次性讀完,

那麼第二次讀buf中資料時,其讀位置指標(也就是第二個引數buf)

不會自動移動,需要程式設計師程式設計控制,而不是簡單的將buf首位址填入第二引數即可。

如可按如下格式實現讀位置移動:write(fp, p1+len, (strlen(p1)-len)。

這樣write第二次迴圈時變會從p1+len處寫資料到fp, 之後的也由此類推,直至(strlen(p1)-len變為0。

3.在write一次可以寫的最大資料範圍內(貌似是bufsiz ,8192),

第三引數count大小最好為buf中資料的大小,以免出現錯誤。

(經過筆者再次試驗,write一次能夠寫入的並不只有8192這麼多,筆者嘗試一次寫入81920000,結果也是可以,

看來其一次最大寫入資料並不是8192,但核心中確實有bufsiz這個引數,具體指什麼還有待研究)

例子:#include

#include

#include

int main()

len+=n;

}return 0;

}總結:此程式中的字串"this is a c test code"有21個字元,經筆者親自試驗,若write時每次寫3個位元組,

雖然可以將p1中資料寫到fp中,但檔案test.txt中會帶有很多亂碼。

唯一正確的做法還是將第三引數設為(strlen(p1) - len,

這樣當write到p1末尾時(strlen(p1) - len將會變為0,

此時符合附加說明(1)中所說情況,write返回0, write結束。

3.程式的功能及其實現 

程式的功能是實現客戶端傳送乙個整型資料,服務端返回乙個倒序的整型資料。

需要解決的問題:

建立服務端和客戶端

資料處理

資料處理部分函式實現:

int num_reverse(int num)

return sum;

}

服務端函式:

#include #include

#include

#include

#include

#include

#include

//define the sockaddr_un structure

int num_reverse(int

num);

intmain()

intclient_sockfd;

struct

sockaddr_un client_addr;

socklen_t len = sizeof

(client_addr);

while(1

)

return0;

}

int num_reverse(int

num)

return

sum;

}

客戶端函式:

#include

#include

#include

#include

#include

#include

#include

intmain()

/*資料處理

*/write(sockfd, &num, 4);//

乙個int 4個位元組

read(sockfd, &num, 4

); printf(

"get an integer from server: %d\n

", num);

/*關閉socket

*/close(sockfd);

return0;

}

makefile:

all:server.c client.c

gcc -g -wall -o server server.c

gcc -g -wall -o client client.c

clean:

rm -rf *.o server client

驗證結果:

//linux 讀寫操作

Socket的學習 一

應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題.多個tcp連線或多個應用程式程序可能需要通過同乙個tcp協議埠傳輸資料.為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp ip協議互動提供了稱為套接字 socket 的介面,區分不同應...

socket程式設計(二)

標頭檔案 功能 建立乙個套接字用於通訊 原型 int socket int domain,int type,int protocol 引數 domain 指定通訊協議族 protocol family type 指定socket型別,流式套接字sock stream,資料報套接字sock dgram...

Socket 程式設計(二)

首先,看主介面 點選鏈結按鈕,開始建立與服務端的連線 socket socket null private void btnstart click object sender,eventargs e catch exception ex 那麼我們再來看看這個recmsg方法 void recmsg ...