linux中ss實現原理,ss 詳解

ss

用來顯示處于活動狀態的套接字信息。ss命令可以用來獲取socket統計信息,它可以顯示和netstat(參考https://www.jianshu.com/p/7630474c39b1)類似的內容。但ss的優勢在于它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。

當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat?/proc/net/tcp,執行速度都會很慢。可能你不會有切身的感受,但請相信我,當服務器維持的連接達到上萬個的時候,使用netstat等于浪費 生命,而用ss才是節省時間。

天下武功唯快不破。ss快的秘訣在于,它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用于分析統計的模塊,可以獲得Linux?內核中第一手的信息,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常運行,只是效率會變得稍慢。

參數(和netstat類似)-h:顯示幫助信息;

-V:顯示指令版本信息;

-n:不解析服務名稱,以數字方式顯示;

-a:顯示所有的套接字;

-l:顯示處于監聽狀態的套接字;

-o:顯示計時器信息;

-m:顯示套接字的內存使用情況;

-p:顯示使用套接字的進程信息;

-i:顯示內部的TCP信息;

-4:只顯示ipv4的套接字;

-6:只顯示ipv6的套接字;

-t:只顯示tcp套接字;

-u:只顯示udp套接字;

-d:只顯示DCCP套接字;

-w:僅顯示RAW套接字;

-x:僅顯示UNIX域套接字。

示例[admin@localhost ~]# ss -t -a

State? ? ? Recv-Q Send-Q? ? ? ? ? ? ? ? ? ? ? ? ? ? Local Address:Port? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Peer Address:Port

LISTEN? ? ? 0? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:3306? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? ? 0? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:http? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? ? 0? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:ssh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? ? 0? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 127.0.0.1:smtp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

ESTAB? ? ? 0? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 112.124.15.130:42071? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 42.156.166.25:http

ESTAB? ? ? 0? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 112.124.15.130:ssh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 121.229.196.235:33398

顯示統計信息[admin@localhost ~]# ss -s

Total: 172 (kernel 189)

TCP:? 10 (estab 2, closed 4, orphaned 0, synrecv 0, timewait 0/0), ports 5

Transport Total? ? ip? ? ? ? IPv6

*? ? ? ? 189? ? ? -? ? ? ? -

RAW? ? ? 0? ? ? ? 0? ? ? ? 0

UDP? ? ? 5? ? ? ? 5? ? ? ? 0

TCP? ? ? 6? ? ? ? 6? ? ? ? 0

INET? ? ? 11? ? ? ? 11? ? ? ? 0

FRAG? ? ? 0? ? ? ? 0? ? ? ? 0

查看進程使用的socket[admin@localhost ~]# ss -pl

State? ? ? Recv-Q Send-Q? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Local Address:Port? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Peer Address:Port

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::ssh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::*? ? ? ? users:(("sshd",1292,4))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:ssh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*? ? ? ? users:(("sshd",1292,3))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 127.0.0.1:ipp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*? ? ? ? users:(("cupsd",1165,7))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ::1:ipp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::*? ? ? ? users:(("cupsd",1165,6))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:32957? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*? ? ? ? users:(("rpc.statd",1104,9))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::57637? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::*? ? ? ? users:(("rpc.statd",1104,11))

LISTEN? ? ? 0? ? ? 80? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::mysql? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::*? ? ? ? users:(("mysqld",1528,17))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:6379? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*? ? ? ? users:(("redis-server",1672,5))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::6379? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::*? ? ? ? users:(("redis-server",1672,4))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::sunrpc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :::*? ? ? ? users:(("rpcbind",1084,11))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:sunrpc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*? ? ? ? users:(("rpcbind",1084,8))

LISTEN? ? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:http? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*? ? ? ? users:(("nginx",1685,13),("nginx",3698,13),("nginx",3699,13))

關于Recv-Q和Send-Q狀態

當 client 通過 connect 向 server 發出 SYN 包時,client 會維護一個 socket 等待隊列,而 server 會維護一個 SYN 隊列

此時進入半鏈接的狀態,如果 socket 等待隊列滿了,server 則會丟棄,而 client 也會由此返回 connection time out;只要是 client 沒有收到 SYN+ACK,3s 之后,client 會再次發送,如果依然沒有收到,9s 之后會繼續發送

半連接 syn 隊列的長度為 max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)? 決定

當 server 收到 client 的 SYN 包后,會返回 SYN, ACK 的包加以確認,client 的 TCP 協議棧會喚醒 socket 等待隊列,發出 connect 調用

client 返回 ACK 的包后,server 會進入一個新的叫 accept 的隊列,該隊列的長度為 min(backlog, somaxconn),默認情況下,somaxconn 的值為 128,表示最多有 129 的 ESTAB 的連接等待 accept(),而 backlog 的值則由int listen(int sockfd, int backlog) (網絡編程的一個參數)中的第二個參數指定。

當 accept 隊列滿了之后,即使 client 繼續向 server 發送 ACK 的包,也會不被相應,此時,server 通過 /proc/sys/net/ipv4/tcp_abort_on_overflow 來決定如何返回,0 表示直接丟丟棄該 ACK,1 表示發送 RST 通知 client;相應的,client 則會分別返回 read timeout 或者 connection reset by peer。上面說的只是些理論,如果服務器不及時的調用 accept(),當 queue 滿了之后,服務器并不會按照理論所述,不再對 SYN 進行應答,返回 ETIMEDOUT。

可以看到,整個 TCP stack 有如下的兩個 queue:

1. 一個是 half open(syn queue) queue(max(tcp_max_syn_backlog, 64)),用來保存 SYN_SENT 以及 SYN_RECV 的信息。

2. 另外一個是 accept queue(min(somaxconn, backlog)),保存 ESTAB 的狀態,但是調用 accept()。

使用 ss 獲取到的 Recv-Q/Send-Q 在 LISTEN 狀態以及非 LISTEN 狀態所表達的含義是不同的。

LISTEN 狀態: Recv-Q 表示的當前等待服務端調用 accept 完成三次握手的 listen backlog 數值,也就是說,當客戶端通過 connect() 去連接正在 listen() 的服務端時,這些連接會一直處于這個 queue 里面直到被服務端 accept();Send-Q 表示的則是最大的 listen backlog 數值,這就就是上面提到的 min(backlog, somaxconn) 的值。

其余狀態: 非 LISTEN 狀態,代表緩沖區字節數量。Recv-Q 表示 receive queue 中的 bytes 數量;Send-Q 表示 send queue 中的 bytes 數值。

查看tcp_diag代碼static void tcp_diag_get_info(struct sock?*sk,?struct inet_diag_msg?*r, void?*_info) {

const?struct tcp_sock?*tp?=?tcp_sk(sk);

struct tcp_info?*info?=?_info;

if?(sk->sk_state?==?TCP_LISTEN)?{

r->idiag_rqueue?=?sk->sk_ack_backlog;

r->idiag_wqueue?=?sk->sk_max_ack_backlog;

}?else?{

r->idiag_rqueue?=?tp->rcv_nxt?-?tp->copied_seq;

r->idiag_wqueue?=?tp->write_seq?-?tp->snd_una;

}

if?(info?!=?NULL)

tcp_get_info(sk,?info);

}

顯示更多的信息

-o, --options 顯示時間信息(定時器)

-m, --memory 顯示 socket 使用的內存

-i, --info 顯示更多 TCP 內部的信息

-s 顯示統計信息~ # ss -a -t -o -4

State ? ? ? Recv-Q Send-Q ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Local Address:Port ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Peer Address:Port

LISTEN ? ? ?0 ? ? ?128 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:openvms-sysipc ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*:*

ESTAB ? ? ? 0 ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.132.189:ssh ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.132.93:hs-port ?timer:(keepalive,65min,0)

ESTAB ? ? ? 0 ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?10.0.64.19:49462 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?10.0.64.107:61616

ESTAB ? ? ? 0 ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.132.189:ssh ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?172.16.132.85:63934 ? ?timer:(keepalive,38min,0)

ESTAB ? ? ? 0 ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?10.0.64.19:60569 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?10.0.64.107:61616

這個輸出更上次輸出相比,多了一個timer輸出。這個輸出描述的是tcp socket上的定時器,在說明這個之前先了解一下linux對一個tcp socket可能設置的定時器。

tcp socket總共有7個定時器,通過4個timer實現。分別是

通過icsk_retransmit_timer實現的重傳定時器、零窗口探測定時器;通過sk_timer實現的連接建立定時器、保活定時器和FIN_WAIT_2定時器;通過icsk_delack_timer實現的延時ack定時器;以及TIME_WAIT定時器。

我們看一下ss的代碼static?const?char?*tmr_name[]?=?{

"off",

"on",

"keepalive",

"timewait",

"persist",

"unknown"

};if?(show_options)?{

if?(r->idiag_timer)?{

if?(r->idiag_timer?>?4)

r->idiag_timer?=?5;

printf(" timer:(%s,%s,%d)",

tmr_name[r->idiag_timer],

print_ms_timer(r->idiag_expires),

r->idiag_retrans);

}

}

對應的內核代碼是if?(icsk->icsk_pending?==?ICSK_TIME_RETRANS)?{

r->idiag_timer?=?1;

r->idiag_retrans?=?icsk->icsk_retransmits;

r->idiag_expires?=?EXPIRES_IN_MS(icsk->icsk_timeout);

}?else?if?(icsk->icsk_pending?==?ICSK_TIME_PROBE0)?{

r->idiag_timer?=?4;

r->idiag_retrans?=?icsk->icsk_probes_out;

r->idiag_expires?=?EXPIRES_IN_MS(icsk->icsk_timeout);

}?else?if?(timer_pending(&sk->sk_timer))?{

r->idiag_timer?=?2;

r->idiag_retrans?=?icsk->icsk_probes_out;

r->idiag_expires?=?EXPIRES_IN_MS(sk->sk_timer.expires);

}?else?{

r->idiag_timer?=?0;

r->idiag_expires?=?0;

}static?int?inet_twsk_diag_fill(struct inet_timewait_sock?*tw, struct sk_buff?*skb,?int?ext,?u32 pid,

u32 seq,?u16 nlmsg_flags, const?struct nlmsghdr?*unlh){

long tmo;

struct inet_diag_msg?*r;

const?unsigned char?*previous_tail?=?skb_tail_pointer(skb);

struct nlmsghdr?*nlh?=?NLMSG_PUT(skb,?pid,?seq,

unlh->nlmsg_type,?sizeof(*r));

r?=?NLMSG_DATA(nlh);

BUG_ON(tw->tw_state?!=?TCP_TIME_WAIT);

nlh->nlmsg_flags?=?nlmsg_flags;

tmo?=?tw->tw_ttd?-?jiffies;

if?(tmo?

tmo?=?0;

r->idiag_family?=?tw->tw_family;

r->idiag_retrans?=?0;

r->id.idiag_if?=?tw->tw_bound_dev_if;

r->id.idiag_cookie[0]?=?(u32)(unsigned long)tw;

r->id.idiag_cookie[1]?=?(u32)(((unsigned long)tw?>>?31)?>>?1);

r->id.idiag_sport?=?tw->tw_sport;

r->id.idiag_dport?=?tw->tw_dport;

r->id.idiag_src[0]?=?tw->tw_rcv_saddr;

r->id.idiag_dst[0]?=?tw->tw_daddr;

r->idiag_state?=?tw->tw_substate;

r->idiag_timer?=?3;

r->idiag_expires?=?DIV_ROUND_UP(tmo?*?1000,?HZ);

r->idiag_rqueue?=?0;

r->idiag_wqueue?=?0;

r->idiag_uid?=?0;

r->idiag_inode?=?0;

timer的輸出含義就是(類型,過期時間,重試次數),這里說一下類型的含義:

off: 當前socket沒有timer

on: 重傳timer

keepalive:連接建立timer or fin_wait_2 timer or 保活timer;具體是那個timer,可以根據連接的狀態來確定。

timewait: TIME_WAITtimer

persist:零窗口探測timer

dst/src dport/sport 語法

可以通過 dst/src/dport/sprot 語法來過濾連接的來源和目標,來源端口和目標端口。

匹配遠程地址和端口號$ ss dst 192.168.1.5

$ ss dst 192.168.119.113:http

$ ss dst 192.168.119.113:443

將本地或者遠程端口和一個數比較,可以使用下面的語法做端口號的過濾:$ ss dport OP PORT

$ ss sport OP PORT

OP 可以代表以下任意一個:<=le小于或等于某個端口號

>=ge大于或等于某個端口號

==eq等于某個端口號

!=ne不等于某個端口號

>gt大于某個端口號

下面是一個簡單的 demo(注意,需要對尖括號使用轉義符):$ ss -tunl sport lt 50

$ ss -tunl sport \< 50

$ ?ss dport = :8080 or sport = :8080

ss 命令還可以通過 TCP 連接的狀態進程過濾,支持的 TCP 協議中的狀態有:established

syn-sent

syn-recv

fin-wait-1

fin-wait-2

time-wait

closed

close-wait

last-ack

listening

closing

除了上面的 TCP 狀態,還可以使用下面這些狀態:all列出所有的 TCP 狀態。

connected列出除了 listening 和 closing 之外的所有 TCP 狀態。

synchronized列出除了 syn-sent 之外的所有 TCP 狀態。

bucket列出 maintained 的狀態,如:time-wait 和 syn-recv。

big列出和 bucket 相反的狀態。

使用 ipv4 時的過濾語法如下:

使用 ipv6 時的過濾語法如下:1$ ss -6 state filter

下面的兩種寫法是等價的,要有使用 \ 轉義小括號,要么使用單引號括起來:$ ss -4n state listening \( dport = :ssh\)

$ ss -4n state listening '( dport = :ssh )'

找出打開套接字/端口應用程序[admin@localhost ~]# ss -pl | grep3306

00*:3306*:* users:(("mysqld",1718,10))ss -o state established '( dport = :smtp or sport = :smtp )' 顯示所有已建立的SMTP連接

ss -o state established '( dport = :http or sport = :http )' 顯示所有已建立的HTTP連接

ss -o state established '( dport = :8080 or sport = :8080 )'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hibernate3.X實現基于CLOB字段類型的注解方式:

一&#xff1a;Hibernate3.X實現基于CLOB字段類型的注解方式的例子&#xff1a;下面直接上代碼&#xff1a; 二&#xff1a;UserInfo.java package cn.gov.csrc.cms.model;import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity;…

linux mint安裝步驟,Linux mint 安裝步驟

##Linux mint 安裝步驟##家里的筆記本以前一直用Deepin系統&#xff0c;但是Deepin系統的wifi實在是太慢了。還有就是啟動軟件是有時候總沒響應&#xff0c;卡死機。 最近重裝系統&#xff0c;選擇了mint ,在這里記錄下安裝步驟。###1.制作U盤啟動盤###下載iso文件&#xff0c;…

linux 商業游戲,Ubuntu下安裝試玩原生Linux版商業游戲Braid

這款原生Linux版商業游戲Braid國外出售價大約在80美元左右。每年在Linux平臺上發布的原生商業游戲是屈指可數&#xff0c;而且這些游戲的質量也是參差不齊。不過這款原生Linux版商業游戲Braid還是值得一玩的&#xff0c;這款Braid游戲創意十足&#xff0c;您可以通過拼圖和時間…

linux centos 7 crontab 啟動,CentOS 7 Linux執行crontab 計劃任務實操 - 好應網

[inlosc_lg_title]一、環境準備[/inlosc_lg_title]yum install vixie-cron #安裝定時任務插件yum install crontabs #安裝定時任務crontabs/bin/systemctl restart crond.service #啟動服務/bin/systemctl reload crond.service #重新載入配置/bin/systemctl status crond.serv…

變量的初始化與使用C語言程序注釋,c - (為什么)使用未初始化的變量未定義行為?...

C標準為編譯器提供了很大的優勢來執行優化。 如果您假設一個簡單的程序模型&#xff0c;其中未初始化的內存被設置為某個隨機位模式&#xff0c;并且所有操作都按照它們的寫入順序執行&#xff0c;那么這些優化的后果可能會令人驚訝。注意&#xff1a;以下示例僅有效&#xff0…

三羊獻瑞c語言編程入門,藍橋杯-三羊獻瑞,

藍橋杯-三羊獻瑞&#xff0c;更多精彩文章請關注公眾號『大海的BLOG』問題觀察下面的加法算式&#xff1a;祥 瑞 生 輝 三 羊 獻 瑞----------------三 羊 生 瑞 氣其中&#xff0c;相同的漢字代表相同的數字&#xff0c;不同的漢字代表不同的數字&#xff0c;‘三’和‘祥’不…

Struts2.3接收post方式提交的表單參數的方式

一&#xff1a;方式一&#xff1a;通過request來獲取&#xff0c;首先讓action實現ServletRequestAware接口&#xff0c;然后通過request來獲取提交的參數&#xff0c;代碼如下: package cn.gov.csrc.flight.action;import java.util.HashMap; import java.util.List; import j…

倒果汁c語言,水果榨汁補維生素C?這些補維生素的錯誤別再犯了

原標題&#xff1a;水果榨汁補維生素C&#xff1f;這些補維生素的錯誤別再犯了蔬菜和水果作為維生素C、礦物質和植物纖維的重要來源&#xff0c;是每天餐桌上都要出現的食物&#xff0c;一旦水果蔬菜吃不夠&#xff0c;身體就會開始找你麻煩。在處理蔬菜水果的時候&#xff0c;…

dos和linux有關系嗎,DOS和Linux近年來的發展比較

大家都聽說過Linux操作系統吧&#xff01;Linux誕生于20世紀的90年代初&#xff0c;于90年代末開始出名并在許多人中開始了實際使用。著名的“開放源代碼”運動更是使新的Linux程序不斷出現&#xff0c;使Linux得到了進一步的發展&#xff0c;尤其是在服務器領域得到了較大的應…

c語言中二維數組的結構體,怎么才能把結構體里面的二維數組打印出來?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓萌新一位&#xff0c;學到結構體在做作業&#xff0c;遇到了這個問題。求提示出現這樣的報錯&#xff1a;[Error] cannot convert char (*)[20] to char* for argument 5 to void HeroShow(int, int, char*, char*, char*, char*)#…

android中資源文件的兩種訪問方式,Android_Android學習筆記-保存文件(Saving Files),Android設備有兩種文件存儲區域 - phpStudy...

Android學習筆記-保存文件(Saving Files)Android設備有兩種文件存儲區域:內部存儲和外部存儲 ("internal" and "external" storage)。這名字來自早期Android&#xff0c;那時大多數Android設備提供兩種存儲方式:內置的非易失的內存(內部存儲)和可移動的存儲…

Struts2.3,s:iterator,c:forEach遍歷map中的list集合

一&#xff1a;首先是<s:iterator></s:iterator>遍歷map中的list集合&#xff0c;代碼如下&#xff1a; 1.首先是后臺代碼&#xff0c;包括定義map和給map中賦值&#xff0c;代碼如下&#xff1a; package cn.gov.csrc.cms.action;import java.util.HashMap; impo…

android 判斷對象,Android網絡判斷知識小結

Android中判斷當前網絡是否可用應用場景&#xff1a;實現判斷當前網絡是否可用當前有可用網絡&#xff0c;如下圖&#xff1a;當前沒有可用網絡&#xff0c;如下圖&#xff1a;實現步驟&#xff1a;1、獲取ConnectivityManager對象Context context activity.getApplicationCon…

android fragment動畫,Fragment 的過場動畫

Fragment 的過場動畫Android,Fragment,動畫2018.08.03在 Android 開發中&#xff0c;有些應用對頁面的過場動畫要求比較高&#xff0c;他們中期望給用戶提供一個良好的用戶體驗。適當的過場動畫可以減少用戶在頁面加載時期等待的焦慮&#xff0c;因為讓他們看一個動畫&#xff…

android 聯系人批量插入,GitHub - Atinerlengs/InsertDemo: android 簡單的批量插入通話記錄、聯系人、短信demo...

[toc]批量插入批量插入通話記錄下面是添加通話數據的代碼&#xff0c;我們自己去構造Tb_calllogs數據&#xff0c;里面可以添加通話記錄數據字段&#xff0c;由于是個簡單的demo&#xff0c;所以只加了number、callType、date、callDuration。/*** 添加通話數據** throws Remot…

html頁面按鈕刪除一條數據庫,需要添加一個刪除按鈕到一個HTML表格從數據庫中刪除記錄與消息...

IDNameCodeActiveEdit<?php foreach($nurseries->result() as $nursery) { ?><?php echo $nursery->id; ?><?php echo $nursery->name; ?><?php echo $nursery->code; ?><?php echo set_bool($nursery->active); ?><…

EL表達式, JSTL, 獲取map集合中key的value

序言&#xff1a;今天在項目中使用了map存儲list和普通對象&#xff0c;但是在jsp中顯示的時候出來問題&#xff0c;后經查閱&#xff0c;終于解決&#xff0c;現在記錄一下&#xff0c;以便以后查閱&#xff1a; 一&#xff1a;后臺代碼如下&#xff1a; package cn.gov.csrc…

html選擇器是什么,CSS3選擇器是什么?

首先我們來看一下displaynone的意思是什么&#xff1f;display:none的意思&#xff1a;隱藏元素并脫離文檔&#xff0c;流就是隱藏該區域&#xff0c;不占實際空間&#xff0c;但對后臺來說真實存在&#xff0c;可以獲取被隱藏的元素簡單的來說就是將元素設置為none的時候既不會…

零基礎學計算機408,又一所重點大學改考408!21計算機考研會全面408嗎?

【北京工業大學】于7月17日發布《關于北京工業大學2021年全國碩士研究生招生考試部分考試科目及考試大綱調整的通知》&#xff0c;要點如下&#xff1a;文法學部0401教育學專業課改考 311統教育學信息學部計算機學院0812計算機科學與技術0839網絡空間安全0854電子信息 (專業學位…

國貿專業要考計算機二級,國貿專業考計算機二級有沒有必要

類似問題答案我是自動化專業的學生&#xff0c;大一的時候有沒有必要考計算機二級證書計算機二級 雖然不是很重要 但是考了也是有好處的 自動化的跟計算機聯系非常大 二級證不怎么重要 但是C語言很重要 對于你們 希望你還是去考個二級作為學習建筑類專業的學生,如果考試計算機二…