在ping原始碼代閱讀(一)中,詳細表述了伺服器端和客戶端的互動過程,在這裡以**的形式分析其過程.
伺服器端:
bind到乙個埠後,使用listen開始收聽所有的請求,這裡在核心建立了乙個長度為10的佇列,一有請求就會放入到隊尾.accept從隊頭取出乙個請求開始處理.然後向此請求寫入資料.
s = socket(pf_inet,sock_stream,0);
memset(&adr_srvr,0,sizeof adr_srvr);
adr_srvr.sin_family = af_inet;
adr_srvr.sin_port = htons(atoi(srvr_port));
if ( strcmp(srvr_addr,"*") != 0 ) else
len_inet = sizeof adr_srvr;
z = bind(s,(struct sockaddr *)&adr_srvr,
len_inet);
z = listen(s,10);
for (;;)
close(c);
}
客戶端:
客戶端連線到這個服務埠,最後這個請求將被執行,寫回資料,在這裡用read把傳回的資料讀出來,read每次唯讀了128的位元組,所以這裡需不斷重複讀.直到資料長度為0時終止.
s = socket(pf_inet,sock_stream,0);
memset(&adr_srvr,0,sizeof adr_srvr);
adr_srvr.sin_family = af_inet;
adr_srvr.sin_port = htons(atoi(srvr_port));
adr_srvr.sin_addr.s_addr =
inet_addr(srvr_addr);
len_inet = sizeof adr_srvr;
z = connect(s,&adr_srvr,len_inet);
while(1)
close(s);
如果知道這個過程如何完成之後,看圖會更加形像. ping原始碼代閱讀 三 UDP資料報程式
非連線的通訊是一種什麼情況呢?可以通過sedto向任何乙個套介面傳送資料,如果想收聽某一套介面上別人傳送過來的資料,通過bind繫結到這個套接中,使用recvfrom接收.如果想做應答,那麼通過recvfrom的第五個引數知道了傳送過來程式的情況,進而可以對這個程式進行應答.這樣就可以多個程式向這乙...
SparkSQL(原始碼閱讀三)
額,沒忍住,想完全了解sparksql,畢竟一直在用嘛,想一次性搞清楚它,所以今天再多看點好了 曾幾何時,有乙個叫做shark的東西,它改了hive的原始碼。突然有一天,spark sql突然出現,如下圖 好了,不逗了,言歸正傳。那麼一條sql傳統資料庫會是怎麼解析的呢?傳統資料庫的解析過程是按ru...
String原始碼閱讀(三)
public string split string regex,int limit else if no match was found,return this if off 0 return new string 如果limit大於最大返回長度,上面else中的 不會執行,在此處將最後一段放入l...