第一篇:Linux網(wǎng)絡(luò)編程培訓(xùn)哪個(gè)好專題
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
Linux網(wǎng)絡(luò)編程培訓(xùn)哪個(gè)好
Linux下的網(wǎng)絡(luò)編程培訓(xùn)哪個(gè)好?先來了解一下什么事Linux下的網(wǎng)絡(luò)編程吧!
Linux下的網(wǎng)絡(luò)編程指的是socket套接字編程,入門比較簡單。在學(xué)校里學(xué)過一些皮毛,平時(shí)就是自學(xué)玩,沒有見識過真正的socket編程大程序,比較遺憾。總感覺每次看的時(shí)候都有收獲,但是每次看完了之后,過段時(shí)間不看,重新拾起這些知識的時(shí)候又要從頭開始,所以,在這里做個(gè)筆記也算是做個(gè)模板,以后可以直接從某一個(gè)階段開始接著玩……
socket套接字基本函數(shù)介紹 1 創(chuàng)建socket套接字
int socket(int family, int type, int protocol);功能介紹:
在Linux操作系統(tǒng)中,一切皆文件,這個(gè)大家都知道,個(gè)人理解創(chuàng)建socket的過程其實(shí)就是一個(gè)獲得文件描述符的過程,當(dāng)然這個(gè)過程會是比較復(fù)雜的??梢詮膬?nèi)核中找到創(chuàng)建socket的代碼,并且socket的創(chuàng)建和其他的listen,bind等操作分離開來。socket函數(shù)完成正確的操作是返回值大于0的文件描述符,當(dāng)返回小于0的值時(shí),操作錯誤。同樣是返回一個(gè)文件描述符,但是會因?yàn)槿齻€(gè)參數(shù)組合不同,對于數(shù)據(jù)具體的工作流程不同,對于應(yīng)用層編程來說,這些也是不可見的。參數(shù)說明:
從socket創(chuàng)建的函數(shù)可以看出,socket有三個(gè)參數(shù),family代表一個(gè)協(xié)
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
議族,比較熟知的就是AF_INET,PF_PACKET等;第二個(gè)參數(shù)是協(xié)議類型,常見類型是SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_PACKET等;第三個(gè)參數(shù)是具體的協(xié)議,對于標(biāo)準(zhǔn)套接字來說,其值是0,對于原始套接字來說就是具體的協(xié)議值。2 地址端口綁定函數(shù)bind
int bind(intsockfd, conststructsockaddr *myaddr, socklen_taddrlen);功能介紹:
bind函數(shù)主要應(yīng)用于服務(wù)器模式一端,其主要的功能是將addrlen長度 structsockaddr類型的myaddr地址與sockfd文件描述符綁定到一起,在sockaddr中主要包含服務(wù)器端的協(xié)議族類型,網(wǎng)絡(luò)地址和端口號等。在客戶端模式中不需要使用bind函數(shù)。當(dāng)bind函數(shù)返回0時(shí),為正確綁定,返回-1,則為綁定失敗。參數(shù)說明:
bind函數(shù)的第一個(gè)參數(shù)sockfd是在創(chuàng)建socket套接字時(shí)返回的文件描述符。
bind函數(shù)的第二個(gè)參數(shù)是structsockaddr類型的數(shù)據(jù)結(jié)構(gòu),由于structsockaddr數(shù)據(jù)結(jié)構(gòu)類型不方便設(shè)置,所以通常會通過對tructsockaddr_in進(jìn)行地質(zhì)結(jié)構(gòu)設(shè)置,然后進(jìn)行強(qiáng)制類型轉(zhuǎn)換成structsockaddr類型的數(shù)據(jù),下面是兩種類型數(shù)據(jù)結(jié)構(gòu)的定義和對應(yīng)關(guān)系圖。
typedef unsigned short sa_family_t;structin_addr {
__be32
s_addr;
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
};
structsockaddr { sa_family_tsa_family;
/* address family, AF_xxx
*/ charsa_data[14];
/* 14 bytes of protocol address */ };
/* Structure describing an Internet(IP)socket address.*/ #define __SOCK_SIZE__
/* sizeof(structsockaddr)
*/ structsockaddr_in { sa_family_tsin_family;
/* Address family
*/
__be16
sin_port;
/* Port number
*/ structin_addrsin_addr;
/* Internet address
*/
/* */ unsigned char
__pad[__SOCK_SIZE__sizeof(unsigned short int)-sizeof(structin_addr)];};
千鋒教育004km.cn Pad to size of `structsockaddr'.中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
圖5 structsockaddr_in和structsockaddr的映射關(guān)系
bind函數(shù)的第三個(gè)參數(shù)是指定structsockaddr類型數(shù)據(jù)的長度,因?yàn)榍懊嬷v過bind函數(shù)的第二個(gè)參數(shù)是通過設(shè)置一個(gè)較容易的數(shù)據(jù)結(jié)構(gòu),然后通過強(qiáng)制類型轉(zhuǎn)換成structsockaddr,實(shí)際上,第二個(gè)參數(shù)具體的數(shù)據(jù)結(jié)構(gòu)的長度會根據(jù)socket創(chuàng)建時(shí),設(shè)置的family協(xié)議族的不同而不同,像AF_UNIX協(xié)議族的bind函數(shù)第二個(gè)參數(shù)的數(shù)據(jù)結(jié)構(gòu)應(yīng)該是structsockaddr_un,其大小和structsockaddr_in不同。3 監(jiān)聽本地端口listen
int listen(intsockfd, int backlog);功能介紹:
剛開始理解listen函數(shù)會有一個(gè)誤區(qū),就是認(rèn)為其操作是在等在一個(gè)新的connect的到來,其實(shí)不是這樣的,真正等待connect的是accept操作,listen的操作就是當(dāng)有較多的client發(fā)起connect時(shí),server端不能及時(shí)的處理已經(jīng)建立的連接,這時(shí)就會將connect連接放在等待隊(duì)列中緩存起來。這個(gè)等待隊(duì)列的長度有l(wèi)isten中的backlog參數(shù)來設(shè)定。listen和accept函數(shù)是服務(wù)器模
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
式特有的函數(shù),客戶端不需要這個(gè)函數(shù)。當(dāng)listen運(yùn)行成功時(shí),返回0;運(yùn)行失敗時(shí),返回值位-1.參數(shù)說明:
sockfd是前面socket創(chuàng)建的文件描述符;backlog是指server端可以緩存連接的最大個(gè)數(shù),也就是等待隊(duì)列的長度。4 接受網(wǎng)絡(luò)請求函數(shù)accept
int accept(intsockfd, structsockaddr *client_addr, socklen_t *len);功能介紹:
接受函數(shù)accept其實(shí)并不是真正的接受,而是客戶端向服務(wù)器端監(jiān)聽端口發(fā)起的連接。對于TCP來說,accept從阻塞狀態(tài)返回的時(shí)候,已經(jīng)完成了三次握手的操作。Accept其實(shí)是取了一個(gè)已經(jīng)處于connected狀態(tài)的連接,然后把對方的協(xié)議族,網(wǎng)絡(luò)地址以及端口都存在了client_addr中,返回一個(gè)用于操作的新的文件描述符,該文件描述符表示客戶端與服務(wù)器端的連接,通過對該文件描述符操作,可以向client端發(fā)送和接收數(shù)據(jù)。同時(shí)之前socket創(chuàng)建的sockfd,則繼續(xù)監(jiān)聽有沒有新的連接到達(dá)本地端口。返回大于0的文件描述符則表示accept成功,否則失敗。參數(shù)說明:
sockfd是socket創(chuàng)建的文件描述符;client_addr是本地服務(wù)器端的一個(gè)structsockaddr類型的變量,用于存放新連接的協(xié)議族,網(wǎng)絡(luò)地址以及端口號等;第三個(gè)參數(shù)len是第二個(gè)參數(shù)所指內(nèi)容的長度,對于TCP來說其值可以用sizeof(structsockaddr_in)來計(jì)算大小,說要說明的是accept的第三個(gè)參數(shù)要是指針的形式,因?yàn)檫@個(gè)值是要傳給協(xié)議棧使用的。
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授 連接目標(biāo)服務(wù)器函數(shù)connect
int connect(intsock_fd, structsockaddr *serv_addr,intaddrlen);功能介紹:
連接函數(shù)connect是屬于client端的操作函數(shù),其目的是向服務(wù)器端發(fā)送連接請求,這也是從客戶端發(fā)起TCP三次握手請求的開始,服務(wù)器端的協(xié)議族,網(wǎng)絡(luò)地址以及端口都會填充到connect函數(shù)的serv_addr地址當(dāng)中。當(dāng)connect返回0時(shí)說明已經(jīng)connect成功,返回值是-1時(shí),表示connect失敗。參數(shù)說明:
connect的第一個(gè)參數(shù)是socket創(chuàng)建的文件描述符;第二個(gè)參數(shù)是一個(gè)structsockaddr類型的指針,這個(gè)參數(shù)中設(shè)置的是要連接的目標(biāo)服務(wù)器的協(xié)議族,網(wǎng)絡(luò)地址以及端口號;第三個(gè)參數(shù)表示第二個(gè)參數(shù)內(nèi)容的大小,與accept不同,這個(gè)值不是一個(gè)指針。
在服務(wù)器端和客戶端建立連接之后是進(jìn)行數(shù)據(jù)間的發(fā)送和接收,主要使用的接收函數(shù)是recv和read,發(fā)送函數(shù)是send和write。因?yàn)閷τ趕ocket套接字來說,最終實(shí)際操作的是文件描述符,所以可以使用對文件進(jìn)行操作的接收和發(fā)送函數(shù)對socket套接字進(jìn)行操作。對于UDP編程來說,其服務(wù)器端和客戶端之間沒有三次握手建立連接,所以服務(wù)器端沒有l(wèi)isten和accept函數(shù),客戶端沒有connect函數(shù)。所以對于服務(wù)器端來說,沒有accept函數(shù),所以使用recvfrom函數(shù)來獲取數(shù)據(jù)的同時(shí)獲得客戶端的協(xié)議族,網(wǎng)絡(luò)地址以及端口號;對于客戶端來說,沒有connect函數(shù),所以使用sendto函數(shù)發(fā)送數(shù)據(jù)的同時(shí)設(shè)置服務(wù)器端的協(xié)議族,網(wǎng)絡(luò)地址以及端口;同理如果recvfrom用在客戶端,則
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
是接收服務(wù)器端數(shù)據(jù)和地址,sendto用在服務(wù)器端,則是發(fā)送到客戶端網(wǎng)絡(luò)地址以及端口數(shù)據(jù)。6 接收數(shù)據(jù)函數(shù)recvfrom
ssize_trecvfrom(intsockfd, void *buf, size_tlen, int flags, structsockaddr *from, socklen_t *fromlen);功能介紹:
對于該函數(shù)主要的功能是,從客戶端或者服務(wù)器端接收數(shù)據(jù)以及發(fā)送方的地址信息存儲到本地的structsockaddr類型參數(shù)變量當(dāng)中,如果函數(shù)返回-1,所說明接收數(shù)據(jù)失敗,如果返回的是大于等于0的值,則說明函數(shù)接收到的數(shù)據(jù)的大小。因?yàn)榭梢栽O(shè)置文件描述符的狀態(tài)為阻塞模式,所以在沒有接收到數(shù)據(jù)時(shí),recvfrom會一直處于阻塞狀態(tài),直到有數(shù)據(jù)接收到。參數(shù)說明:
sockfd是創(chuàng)建socket時(shí)的文件描述符;buf用于存儲接收到的數(shù)據(jù)緩沖區(qū),接收的數(shù)據(jù)將放到這個(gè)指針?biāo)赶虻膬?nèi)容的空間中;len是接收緩沖區(qū)的大??;from是指向structsockaddr的指針,接收發(fā)送方地址信息;fromlen是表示第5個(gè)參數(shù)所指向內(nèi)容的長度,可以使用sizeof(structsockaddr)來定義大小,不過因?yàn)槭且獋鹘o內(nèi)核協(xié)議棧,所以使用了指針類型。7 發(fā)送數(shù)據(jù)函數(shù)sendto
sizeof_tsendto(intsockfd, const void *buf, size_tlen, int flag, conststructsockaddr *to, socklen_ttolen);功能介紹:
sendto函數(shù)主要根據(jù)填充的接收方的地址信息向客戶端或者服務(wù)器端發(fā)
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
送數(shù)據(jù),接收方的地址信息會提前設(shè)置在structsockaddr類型的參數(shù)指針中,當(dāng)返回值-1時(shí),表明發(fā)送失敗,當(dāng)返回值大于等于0時(shí),表示發(fā)送成功,并且發(fā)送數(shù)據(jù)的大小會通過返回值傳遞回來。參數(shù)說明:
sockfd是有socket創(chuàng)建的文件描述符;buf是發(fā)送數(shù)據(jù)緩沖區(qū),要發(fā)送的數(shù)據(jù)會放在這個(gè)指針指向的內(nèi)容空間中;len是發(fā)送緩沖區(qū)的大?。籺o是一個(gè)structsockaddr類型的指針,其指向地址的內(nèi)容是接收方地址信息;tolen表示第5個(gè)參數(shù)指向的數(shù)據(jù)內(nèi)容的長度,傳遞的是值,可以用sizeof(structsockaddr)計(jì)算。
以上就是千鋒Linux學(xué)院的學(xué)習(xí)筆記。另附心得體會一篇:
從零基礎(chǔ)開始學(xué)Linux或者是轉(zhuǎn)行學(xué)習(xí)Linux,參加培訓(xùn)會保證你在單位時(shí)間內(nèi)學(xué)到更多,畢竟隨著Linux行業(yè)的快速發(fā)展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業(yè)度到職業(yè)素質(zhì),只有比別人更突出和優(yōu)秀,才能夠在這個(gè)相互選擇的世界當(dāng)中擁有更多的選擇權(quán)利?,F(xiàn)在想要學(xué)習(xí)Linux技術(shù),只有通過參加培訓(xùn)才可以保證快速掌握所學(xué)知識和技能,所以培訓(xùn)是比較靠譜的。
Linux下的網(wǎng)絡(luò)編程培訓(xùn)哪個(gè)好?千鋒教育的Linux課程專注于當(dāng)前熱門的Linux相關(guān)技術(shù),就Linux而言,內(nèi)容全面而細(xì)致的。Linux教學(xué)團(tuán)隊(duì)由眾多名師打造,擁有多年教學(xué)經(jīng)驗(yàn)和高超的Linux授課技巧和實(shí)戰(zhàn)視野,讓你理論和實(shí)戰(zhàn)兼得。
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
千鋒教育004km.cn
第二篇:Linux編程培訓(xùn)哪個(gè)好
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
Linux編程培訓(xùn)哪個(gè)好
想知道Linux編程培訓(xùn)哪個(gè)好?先來了解一下什么是Linux編程吧!
Linux編程,比需要了解線程的問題。線程間通信之信號量
線程的信號量主要就是實(shí)現(xiàn)對公共資源的一種控制管理。當(dāng)公共資源增加時(shí),信號量的值增加;當(dāng)公共資源減少時(shí),信號量的值減少;只有信號量的值大于0時(shí),才能訪問信號量所代表的公共資源。其實(shí)功能和之前的ucos的信號量功能類似。線程信號量初始化sem_init
intsem_init(sem_t *sem, intpshared, unsigned int value);功能介紹:
該函數(shù)主要的功能是創(chuàng)建一個(gè)信號量,設(shè)置該信號量的值,并且設(shè)置信號量的使用范圍。信號量創(chuàng)建成功后,可以對其進(jìn)行加減操作。參數(shù)說明:
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
第一個(gè)參數(shù)sem是一個(gè)指向信號量結(jié)構(gòu)的指針,當(dāng)信號量初始化成功后,可以的這個(gè)信號量指針進(jìn)行加減操作;第二個(gè)參數(shù)表示信號量的共享屬性,當(dāng)其值不為0時(shí),信號量可以在進(jìn)程間共享,如果等于0,則只能在同一個(gè)進(jìn)程中的多個(gè)線程間共享;第三個(gè)參數(shù)用于設(shè)置信號量初始化時(shí)候的值。2 線程信號量增加函數(shù)sem_post
intsem_post(sem_t *sem);功能介紹:
該函數(shù)用于增加信號量的值,每次增加值為1。當(dāng)有線程在等待該信號量,則等待信號量返回,不增加信號量的值。參數(shù)說明:
sem參數(shù)是初始化時(shí)候創(chuàng)建的信號量結(jié)構(gòu)體,用于記錄信號量值得參數(shù)。3 線程信號量減少函數(shù)sem_wait
intsem_wait(sem_t *sem);功能介紹:
該函數(shù)用于減少信號量的值,每次減少值為1。當(dāng)信號量的值為0,則線程會阻塞一直等待信號量的值大于0為止,當(dāng)值為0時(shí),不在減少。參數(shù)說明:
sem參數(shù)是初始化時(shí)候創(chuàng)建的信號量結(jié)構(gòu)體。4 線程信號量的銷毀函數(shù)sem_destroy
intsem_destroy(sem_t *sem);功能介紹:
函數(shù)用于釋放創(chuàng)建的信號量。
千鋒教育004km.cn
中國IT職業(yè)教育領(lǐng)先品牌
精品課程 全程面授
參數(shù)說明:
sem參數(shù)是初始化時(shí)候創(chuàng)建的信號量結(jié)構(gòu)體。
使用線程的信號量進(jìn)行通信,可以有效的對線程資源進(jìn)行合理的分配,同時(shí)可以使線程以一個(gè)合理的方式進(jìn)行調(diào)度。下面的代碼是一個(gè)小小的實(shí)例,用很常規(guī)的方法來使用信號量,當(dāng)線程獲得獲得信號量之后,在處理完相應(yīng)的操作之后會主動的釋放掉信號量。其實(shí)可以根據(jù)信號量的wait和post自己設(shè)計(jì)使用信號量。不過需要注意的是在wait和post函數(shù)分開使用時(shí),可能會因?yàn)榫€程優(yōu)先級等問題,post和wait被調(diào)用的次數(shù)不是對等的,這時(shí)候這時(shí)候可能出現(xiàn)的問題是不可控的,在這種方式設(shè)計(jì)程序時(shí),需要把大部分的情況考慮進(jìn)去,當(dāng)然可能出現(xiàn)的情況的種數(shù)也是從0到1質(zhì)變,從1到n量變得過程。
#include sem_tsem;7 intsemValue;8 void *pthread_wait(void *argv)10 { 11 while(1) 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 { 13 sem_wait(&sem);14 sem_getvalue(&sem, &semValue);15 printf(“This is in phtread WAIT function!sem = %dn”, semValue);16 sem_post(&sem);17 sleep(1);18 } 19 pthread_exit(“exit wait pthread!n”);20 } 21 void *pthread_post(void *argv)23 { 24 while(1)25 { 26 sem_wait(&sem);27 sem_getvalue(&sem, &semValue);28 printf(“This is in phtread POST function!sem = %dn”, semValue);29 sem_post(&sem);30 sleep(1);31 } 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 pthread_exit(“exit post pthread!”);33 } 34 intmain(void)36 { 37 pthread_tpt[2];38 void *ret;39 sem_init(&sem,0,2);41 pthread_create(&pt[0], NULL, &pthread_wait, NULL);42 pthread_create(&pt[1], NULL, &pthread_post, NULL);43 pthread_join(pt[0], &ret);44 printf(“return value %s”, ret);45 pthread_join(pt[1], &ret);46 printf(“return value %s”, ret);47 return 0;49 } 上面代碼的運(yùn)行結(jié)果如下,因?yàn)槭蔷€程采用了無限循環(huán)的方式,所以pthread_exit和pthread_join不會執(zhí)行到。 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 如果將上面代碼中的第26行注釋掉,運(yùn)行結(jié)果如下,可以看到信號量的值一直在增加,就如上面提到的因?yàn)閟em_wait函數(shù)和sem_post函數(shù)不能同時(shí)使用時(shí),會出現(xiàn)一些不可控的運(yùn)行結(jié)果。也可以利用這種情況,設(shè)計(jì)程序。 以上就是千鋒Linux學(xué)院的學(xué)習(xí)筆記。另附心得體會一篇: 從零基礎(chǔ)開始學(xué)Linux或者是轉(zhuǎn)行學(xué)習(xí)Linux,參加培訓(xùn)會保證你在單位時(shí)間內(nèi)學(xué)到更多,畢竟隨著Linux行業(yè)的快速發(fā)展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業(yè)度到職業(yè)素質(zhì),只有比別人更突出和優(yōu)秀,才能夠在這個(gè)相互選擇的世界當(dāng)中擁有更多的選擇權(quán)利。現(xiàn)在想要學(xué)習(xí)Linux技術(shù),只有通過參加培訓(xùn)才可以保證快速掌握所學(xué)知識和技能,所 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 以培訓(xùn)是比較靠譜的。 Linux編程培訓(xùn)哪個(gè)好?千鋒教育的Linux課程專注于當(dāng)前熱門的Linux相關(guān)技術(shù),就Linux而言,內(nèi)容全面而細(xì)致的。Linux教學(xué)團(tuán)隊(duì)由眾多名師打造,擁有多年教學(xué)經(jīng)驗(yàn)和高超的Linux授課技巧和實(shí)戰(zhàn)視野,讓你理論和實(shí)戰(zhàn)兼得。 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 學(xué)習(xí)Linux編程哪個(gè)好 想知道Linux編程培訓(xùn)哪家好?先來了解一下什么是Linux編程吧!Linux下的網(wǎng)絡(luò)編程指的是socket套接字編程,入門比較簡單。在學(xué)校里學(xué)過一些皮毛,平時(shí)就是自學(xué)玩,沒有見識過真正的socket編程大程序,比較遺憾??偢杏X每次看的時(shí)候都有收獲,但是每次看完了之后,過段時(shí)間不看,重新拾起這些知識的時(shí)候又要從頭開始,所以,在這里做個(gè)筆記也算是做個(gè)模板,以后可以直接從某一個(gè)階段開始接著玩…… IO復(fù)用之select函數(shù) select函數(shù)用于IO復(fù)用,它用于監(jiān)視多個(gè)文件描述符集合,看規(guī)定時(shí)間內(nèi)有沒有事件產(chǎn)生。 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);功能介紹: 該函數(shù)主要的功能是對需要操作的文件描述符集合進(jìn)行查詢,目標(biāo)文件描述符中有可以讀,寫或者異常錯誤操作的情況時(shí),會返回一個(gè)大于0的整數(shù)值,表示可以對該文件描述符進(jìn)行操作。select函數(shù)返回0,表示超時(shí);返回-1,表示發(fā)生錯誤;返回大于0的整數(shù)值,表示有符合要求的文件描述事件產(chǎn)生。當(dāng)不需要監(jiān)視某種文件描述符時(shí),設(shè)置參數(shù)為NULL。參數(shù)說明: nfds:是一個(gè)整型變量,其值是加入到后面三個(gè)文件描述符集合中的最大文件描 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 述符的值加1。 readfds:可讀文件描述符集合,通過FD_SET向該文件描述符集合中加入需要監(jiān)視的目標(biāo)文件描述符,當(dāng)有符合要求的文件描述符時(shí),select會返回一個(gè)大于0的值,同時(shí)會把原來集合中的不可讀的文件描述符清掉,如果想在次監(jiān)視可讀文件描述,需要重新FD_SET。 writefds:可寫文件描述符集合,同樣通過FD_SET函數(shù)向結(jié)合中加入需要被監(jiān)視的目標(biāo)文件描述符,select返回時(shí),同樣會把不可寫文件描述符清掉,如果需要重新監(jiān)視文件描述符,需要重新FD_SET設(shè)置。 exceptfds:該描述符集合是用于監(jiān)視文件描述符集合中的任何文件是否發(fā)生錯誤。 timeout:用于設(shè)置超時(shí)的最長等待時(shí)間,如果在該規(guī)定時(shí)間內(nèi)沒有返回一個(gè)大于0的值,則返回0,表示超時(shí)。如果超時(shí)間設(shè)置為NULL,表示阻塞等待,直到符合條件的文件描述符在集合中出現(xiàn),當(dāng)timeout的值為0時(shí),select會立即返回。 timeout的數(shù)據(jù)結(jié)構(gòu)如下: struct timeval { time_t tv_sec; /*秒*/ long tv_usec; /*微秒*/ };有4個(gè)宏可以操作文件描述符集合: FD_ZERO: 用于清空文件描述符集合,F(xiàn)D_ZERO(&fds)。 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 FD_SET:向某個(gè)文件描述符結(jié)合中加入文件描述符, FD_SET(fd, &fds)。FD_CLR:從某個(gè)文件描述符結(jié)合中取出某個(gè)文件描述符, FD_CLR(fd, &fds)。FD_ISSET:測試某個(gè)文件描述符是否在某個(gè)文件描述符集合中, FD_ISSET(fd, &fds)。 下面是本實(shí)用socket編程,并且利用select IO實(shí)現(xiàn)的一個(gè)server和client實(shí)時(shí)通信的例子,為了顯示更直觀,加了一些打印以及接收數(shù)據(jù)上的操作,程序還有bug,希望閱讀的人不要介意,或者自行修改。代碼如下,可以作為學(xué)習(xí)socket和select的一個(gè)實(shí)例。server.c文件源碼如下: #include int main(void)13 { 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 int sockfd, clientfd; struct sockaddr_in sockServer, sockClient;16 struct timeval tv;17 fd_set readfds, writefds;18 int readlen, writelen;19 char buffer[SIZE];20 sockfd = socket(AF_INET, SOCK_STREAM, 0);22 if(sockfd < 0)23 { 24 perror(“create socket failed!n”);25 return-1;26 } 27 bzero(&sockServer, 0);29 sockServer.sin_family = AF_INET;30 sockServer.sin_port = htons(SPORT);31 sockServer.sin_addr.s_addr = htonl(INADDR_ANY);32 if(bind(sockfd,(struct sockaddr *)&sockServer, sizeof(struct sockaddr_in))< 0)34 { 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 perror(“bind socket failed!n”);36 return-1;37 } 38 if(listen(sockfd, BACKLOG)< 0)40 { 41 perror(“l(fā)isten failed!n”);42 } 43 printf(“Server is listening......n”);45 while(1)47 { 48 int len = sizeof(struct sockaddr_in);49 int ret;50 time_t timet;51 clientfd = accept(sockfd,(struct sockaddr *)&sockClient, &len);53 if(clientfd < 0)54 { 55 perror(“accept failed!n”); 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 return-1;57 } 58 for(;;)60 { 61 FD_ZERO(&readfds);FD_SET(1, &readfds);FD_SET(clientfd, &readfds);tv.tv_usec = 0;tv.tv_sec = 60; ret = select(clientfd+1, &readfds, NULL, NULL, &tv);switch(ret){ case 0: printf(“select timeout!n”); break; case-1: perror(“select return failed!n”); goto closesocket; default: if(FD_ISSET(clientfd, &readfds)> 0) 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 { 79 memset(buffer, 0, SIZE);80 readlen = read(clientfd, buffer, SIZE);81 if(readlen < 0)82 { 83 ctime(&timet));88 perror(“read data failed!n”); goto closesocket; } time(&timet); printf(“Opposite: %d %s”, clientfd,strcat(buffer, “n”); writelen = write(0, buffer, readlen+1); if(writelen < 0) { perror(“write data failed!n”); goto closesocket; } } if(FD_ISSET(1, &readfds)> 0){ time(&timet); 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 printf(“Owner: %d %sn”, sockfd, ctime(&timet));100 memset(buffer, 0, SIZE);101 readlen = read(1, buffer, SIZE);102 if(readlen < 0)103 112 113 } 114 } 115 } 116 closesocket: 117 close(clientfd);118 } 119 close(sockfd); { perror(“read data failed!n”); goto closesocket;} writelen = write(clientfd, buffer, readlen);if(writelen < 0){ perror(“write data failed!n”); goto closesocket;} 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 120 121 return 0;122 } client.c文件源碼如下: #include int main(void)12 { 13 int sockfd, clientfd; struct sockaddr_in sockServer;15 struct timeval tv;16 fd_set readfds;17 int readlen, writelen; 精品課程 全程面授 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 char buffer[SIZE];19 time_t timet;20 sockfd = socket(AF_INET, SOCK_STREAM, 0);22 if(sockfd < 0)23 { 24 perror(“create socket failed!n”);25 return-1;26 } 27 bzero(&sockServer, 0);29 sockServer.sin_family = AF_INET;30 sockServer.sin_port = htons(SPORT);31 sockServer.sin_addr.s_addr = htonl(INADDR_ANY);32 if(connect(sockfd,(struct sockaddr *)&sockServer, sizeof(struct sockaddr_in))< 0)34 { 35 perror(“connect failed!n”);36 close(sockfd);37 } 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 while(1)40 { 41 int ret;42 FD_ZERO(&readfds);44 FD_SET(1, &readfds);45 FD_SET(sockfd, &readfds);46 tv.tv_usec = 0;47 tv.tv_sec = 60;48 ret = select(sockfd+1, &readfds, NULL, NULL, &tv);50 switch(ret)51 { 52 case 0: 53 printf(“select timeout!n”);54 break;55 case-1: 56 perror(“select return failed!n”);57 goto closesocket;58 default: 59 if(FD_ISSET(sockfd, &readfds)> 0)60 { 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 memset(buffer, 0, SIZE);62 readlen = read(sockfd, buffer, SIZE);63 if(readlen < 0)64 { 65 perror(“read data failed!n”);66 ctime(&timet));70 goto closesocket; } time(&timet); printf(“Opposite: %s %s”, “Server”,strcat(buffer, “n”); writelen = write(0, buffer, readlen + 1); if(writelen < 0) { perror(“write data failed!n”); goto closesocket; } } if(FD_ISSET(1, &readfds)> 0){ time(&timet); printf(“Owner: %d %sn”, sockfd,千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 ctime(&timet));82 memset(buffer, 0, SIZE);83 readlen = read(1, buffer, SIZE);84 if(readlen < 0)85 { 86 perror(“read data failed!n”);87 goto closesocket;88 } 89 writelen = write(sockfd, buffer, readlen);90 if(writelen < 0)91 { 92 perror(“write data failed!n”);93 goto closesocket;94 } 95 } 96 } 97 closesocket: 99 close(clientfd);100 } 101 close(sockfd);102 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 return 0;104 } 運(yùn)行結(jié)果如下所示: 以上就是千鋒Linux學(xué)院的學(xué)習(xí)筆記。另附心得體會一篇: 從零基礎(chǔ)開始學(xué)Linux或者是轉(zhuǎn)行學(xué)習(xí)Linux,參加培訓(xùn)會保證你在單位時(shí)間內(nèi)學(xué)到更多,畢竟隨著Linux行業(yè)的快速發(fā)展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業(yè)度到職業(yè)素質(zhì),只有比別人更突出和優(yōu)秀,才能夠在這個(gè)相互選擇的世界當(dāng)中擁有更多的選擇權(quán)利。現(xiàn)在想要學(xué)習(xí)Linux技術(shù),只有通過參加培訓(xùn)才可以保證快速掌握所學(xué)知識和技能,所以培訓(xùn)是比較靠譜的。 學(xué)習(xí)Linux編程哪個(gè)好?千鋒教育的Linux課程專注于當(dāng)前熱門的Linux相關(guān)技術(shù),就Linux而言,內(nèi)容全面而細(xì)致的。Linux教學(xué)團(tuán)隊(duì)由眾多名師打造,擁有多年教學(xué)經(jīng)驗(yàn)和高超的Linux授課技巧和實(shí)戰(zhàn)視野,讓你理論和實(shí)戰(zhàn)兼得。 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 Linux網(wǎng)絡(luò)編程培訓(xùn)哪家好 想知道Linux下的網(wǎng)絡(luò)編程培訓(xùn)哪家好?先來了解一下什么是Linux下的網(wǎng)絡(luò)編程吧! Linux下的網(wǎng)絡(luò)編程指的是socket套接字編程,入門比較簡單。在學(xué)校里學(xué)過一些皮毛,平時(shí)就是自學(xué)玩,沒有見識過真正的socket編程大程序,比較遺憾??偢杏X每次看的時(shí)候都有收獲,但是每次看完了之后,過段時(shí)間不看,重新拾起這些知識的時(shí)候又要從頭開始,所以,在這里做個(gè)筆記也算是做個(gè)模板,以后可以直接從某一個(gè)階段開始接著玩…… 1.socket套接字介紹 socket機(jī)制其實(shí)就是包括socket, bind, listen, connect, accept等函數(shù)的方法,其通過指定的函數(shù)實(shí)現(xiàn)不同的協(xié)議(IP4,IP6等)的數(shù)據(jù)在不同層之間的傳輸和獲取等處理。其實(shí)個(gè)人理解socket就是處于應(yīng)用層和TCP/IP協(xié)議之間的一個(gè)中間層,具體的數(shù)據(jù)分析,重組,拆分等操作對于應(yīng)用層的網(wǎng)絡(luò)編程者來說都是不可見的,這些都有協(xié)議棧內(nèi)核實(shí)現(xiàn),應(yīng)用層的網(wǎng)絡(luò)編程會通過設(shè)置socket機(jī)制中創(chuàng)建socket時(shí)參數(shù)不同,而接收或者發(fā)送不同類型的數(shù)據(jù)。 對于TCP/IP在這里就不過多的講,但是需要提及的是經(jīng)典的TCP/IP參考模型是分為4個(gè)層次:應(yīng)用層,傳輸層,網(wǎng)絡(luò)互聯(lián)層,主機(jī)到網(wǎng)絡(luò)層。標(biāo)準(zhǔn)的套接字編程主要是指TCP和UDP的網(wǎng)絡(luò)編程,socket網(wǎng)絡(luò)編程的模式就是分server和client,通過server端首先建立,client端聯(lián)接進(jìn)行通信。網(wǎng)絡(luò)協(xié)議棧內(nèi)核實(shí)現(xiàn)的功能主要就是在數(shù)據(jù)到達(dá)每一層時(shí),給數(shù)據(jù)加上或者去掉協(xié)議包頭,或者進(jìn)行校驗(yàn),數(shù)據(jù)重組,拆分等操作,最后得到我們想要的數(shù)據(jù)格式。 下面簡單列一下TCP/IP參考模型中主要的協(xié)議類型(圖片來自Linux網(wǎng)絡(luò) 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 編程)。 圖1 TCP/IP 參考模型的層次結(jié)構(gòu) 標(biāo)準(zhǔn)套接字分為TCP和UDP協(xié)議兩種不同type的工作流程,TCP網(wǎng)絡(luò)編程相對于UDP來說相對復(fù)雜,因?yàn)門CP是面向連接的服務(wù),其中包括三次握手建立連接的過程,而UDP則是無連接的服務(wù),下圖介紹了TCP服務(wù)使用socket套接字建立連接的過程,以及進(jìn)行數(shù)據(jù)交互的過程。 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 圖2 TCP 建立socket通信的流程 TCP和UDP的網(wǎng)絡(luò)編程模式有兩種,一種是服務(wù)器模式,另一種是客戶端模式,因?yàn)門CP是面向連接的服務(wù),所以在socket機(jī)制當(dāng)中,TCP的服務(wù)器模式比UDP的服務(wù)器模式多了listen,accept函數(shù),TCP客戶端比UDP客戶端多了connect函數(shù)。下面是TCP和UDP網(wǎng)絡(luò)編程的兩種模式流程圖。下面將結(jié)合圖2,3,4介紹一下TCP socket的機(jī)制是如何實(shí)現(xiàn)的。 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 圖3 TCP 服務(wù)器端與客戶端通信流程 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 圖4 UDP服務(wù)器端和客戶端通信流程 以上就是千鋒Linux學(xué)院的學(xué)習(xí)筆記。另附心得體會一篇: 從零基礎(chǔ)開始學(xué)Linux或者是轉(zhuǎn)行學(xué)習(xí)Linux,參加培訓(xùn)會保證你在單位時(shí)間內(nèi)學(xué)到更多,畢竟隨著Linux行業(yè)的快速發(fā)展,未來必將會面臨更多的競爭,所以只有不遺余力的把自己打造成一把利劍,從專業(yè)度到職業(yè)素質(zhì),只有比別人更突出和優(yōu)秀,才能夠在這個(gè)相互選擇的世界當(dāng)中擁有更多的選擇權(quán)利。現(xiàn)在想要學(xué)習(xí)Linux技術(shù),只有通過參加培訓(xùn)才可以保證快速掌握所學(xué)知識和技能,所以培訓(xùn)是比較靠譜的。 Linux下的網(wǎng)絡(luò)編程培訓(xùn)哪家好?千鋒教育的Linux課程專注于當(dāng)前熱門的Linux相關(guān)技術(shù),就Linux而言,內(nèi)容全面而細(xì)致的。Linux教學(xué)團(tuán)隊(duì)由眾多名 千鋒教育004km.cn 中國IT職業(yè)教育領(lǐng)先品牌 精品課程 全程面授 師打造,擁有多年教學(xué)經(jīng)驗(yàn)和高超的Linux授課技巧和實(shí)戰(zhàn)視野,讓你理論和實(shí)戰(zhàn)兼得。 千鋒教育004km.cn 英語口語培訓(xùn)機(jī)構(gòu)哪個(gè)好及外教費(fèi)用 外教公司哪家好? 外教公司可分為為學(xué)校公司服務(wù)的以及為個(gè)人服務(wù)的外教公司。有些學(xué)校在把英語外教課程外包給某家外教公司的越來越多,這樣學(xué)習(xí)省去了招聘外教,辦理手續(xù)等繁雜的工作,而且教學(xué)的專業(yè)化程度會更高一些,但是北京市場上由于各方面的原因沒有幾家資深為學(xué)習(xí)服務(wù)的外教公司。 為個(gè)人服務(wù)的外教公司已經(jīng)和英語培訓(xùn)公司非常的接近,只是不提供硬性的教學(xué)設(shè)施例如教室。但是如果可以在家里或公共地點(diǎn)上課的同學(xué)來說是個(gè)非常不錯的選擇。不僅降低了學(xué)費(fèi)的成本,而且能節(jié)省很多的上課路上奔波的時(shí)間。北京市場上提高此類服務(wù)的公司比較典型的是速恩英語,對教師資質(zhì)要求比較高而且課時(shí)費(fèi)可以按次結(jié)算。 外教價(jià)格/外教費(fèi)用是多少? 是和很多因素相關(guān)的,例如外教老師的資質(zhì),外教上課的地點(diǎn):外教上門和在公共地點(diǎn)上課費(fèi)是不一樣的,外教上課的時(shí)間,外教上課的頻率,外教的教學(xué)內(nèi)容,例如日常口語相對容易,但是雅思托福、SAT,商務(wù)英語等專業(yè)的課程外教老師的備課時(shí)間會更多,所以收費(fèi)也會有所增長,如果需要詳細(xì)了解可以電話咨詢第三篇:學(xué)習(xí)Linux編程哪個(gè)好
第四篇:Linux網(wǎng)絡(luò)編程培訓(xùn)哪家好
第五篇:英語口語培訓(xùn)機(jī)構(gòu)哪個(gè)好