freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

socket簡(jiǎn)易教程(編輯修改稿)

2025-07-22 07:28 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 dr,sizeof(structsockaddr))。   .   .   再一次,你應(yīng)該檢查connect()的返回值它在錯(cuò)誤的時(shí)候返回1,并設(shè)置全局錯(cuò)誤變量errno。 同時(shí),你可能看到,我沒有調(diào)用bind()。因?yàn)槲也辉诤醣镜氐亩丝谔?hào)。我只關(guān)心我要去那。內(nèi)核將為我選擇一個(gè)合適的端口號(hào),而我們所連接的地方也自動(dòng)地獲得這些信息。一切都不用擔(dān)心。 10)listen()函數(shù):是換換內(nèi)容得時(shí)候了。假如你不希望與遠(yuǎn)程的一個(gè)地址相連,或者說(shuō),僅僅是將它踢開,那你就需要等待接入請(qǐng)求并且用各種方法處理它們。處理過(guò)程分兩步:首先,你聽listen(),然后,你接受accept()(請(qǐng)看下面的內(nèi)容)。除了要一點(diǎn)解釋外,系統(tǒng)調(diào)用listen也相當(dāng)簡(jiǎn)單。intlisten(intsockfd,intbacklog)。sockfd是調(diào)用socket()返回的套接字文件描述符。backlog是在進(jìn)入隊(duì)列中允許的連接數(shù)目。什么意思呢?進(jìn)入的連接是在隊(duì)列中一直等待,直到你接受(accept())連接,請(qǐng)看下面的文章。它們的數(shù)目限制于隊(duì)列的允許。大多數(shù)系統(tǒng)的允許數(shù)目是20,你也可以設(shè)置為5到10。和別的函數(shù)一樣,在發(fā)生錯(cuò)誤的時(shí)候返回1,并設(shè)置全局錯(cuò)誤變量errno。你可能想象到了,在你調(diào)用listen()前你或者要調(diào)用bind()或者讓內(nèi)核隨便選擇一個(gè)端口。如果你想偵聽進(jìn)入的連接,那么系統(tǒng)調(diào)用的順序可能是這樣的:socket()?! ind()。listen()?! ?*accept()應(yīng)該在這*/因?yàn)樗喈?dāng)?shù)拿髁耍覍⒃谶@里不給出例子了。(在accept()那一章的代碼將更加完全。)真正麻煩的部分在accept()。11)accept()函數(shù):  準(zhǔn)備好了,系統(tǒng)調(diào)用accept()會(huì)有點(diǎn)古怪的地方的!你可以想象發(fā)生這樣的事情:有人從很遠(yuǎn)的地方通過(guò)一個(gè)你在偵聽(listen())的端口連接(connect())到你的機(jī)器。它的連接將加入到等待接受(accept())的隊(duì)列中。你調(diào)用accept()告訴它你有空閑的連接。它將返回一個(gè)新的套接字文件描述符!這樣你就有兩個(gè)套接字了,原來(lái)的一個(gè)還在偵聽你的那個(gè)端口,新的在準(zhǔn)備發(fā)送(send())和接收(recv())數(shù)據(jù)。這就是這個(gè)過(guò)程!函數(shù)是這樣定義的:includesys/intaccept(intsockfd,void*addr,int*addrlen)。sockfd相當(dāng)簡(jiǎn)單,是和listen()中一樣的套接字描述符。addr是個(gè)指向局部的數(shù)據(jù)結(jié)構(gòu)sockaddr_in的指針。這是要求接入的信息所要去的地方(你可以測(cè)定那個(gè)地址在那個(gè)端口呼叫你)。在它的地址傳遞給accept之前,addrlen是個(gè)局部的整形變量,設(shè)置為sizeof(structsockaddr_in)。accept將不會(huì)將多余的字節(jié)給addr。如果你放入的少些,那么它會(huì)通過(guò)改變addrlen的值反映出來(lái)。同樣,在錯(cuò)誤時(shí)返回1,并設(shè)置全局錯(cuò)誤變量errno?,F(xiàn)在是你應(yīng)該熟悉的代碼片段。includeincludesys/includesys/defineMYPORT3490/*用戶接入端口*/defineBACKLOG10/*多少等待連接控制*/main()  {  intsockfd,new_fd。/*listenonsock_fd,newconnectiononnew_fd*/  structsockaddr_inmy_addr。/*地址信息*/  structsockaddr_intheir_addr。/*connector39。saddressinformation*/  intsin_size。 sockfd=socket(AF_INET,SOCK_STREAM,0)。/*錯(cuò)誤檢查*/ =AF_INET。/*hostbyteorder*/  =htons(MYPORT)。/*short,networkbyteorder*/  =INADDR_ANY。/*autofillwithmyIP*/  bzero(amp。(),。/*zerotherestofthestruct*/ /*don39。tforgetyourerrorcheckingforthesecalls:*/  bind(sockfd,(structsockaddr*)amp。my_addr,sizeof(structsockaddr))。//在調(diào)用listen()前你或者要調(diào)用bind()或者讓內(nèi)核隨便選擇一個(gè)端口 listen(sockfd,BACKLOG)。 sin_size=sizeof(structsockaddr_in)?! ew_fd=accept(sockfd,amp。their_addr,amp。sin_size)?! ?  .  . 注意,在系統(tǒng)調(diào)用send()和recv()中,你應(yīng)該使用新的套接字描述符new_fd。如果你只想讓一個(gè)連接進(jìn)來(lái),那么你可以使用close()去關(guān)閉原來(lái)的文件描述符sockfd,來(lái)避免同一個(gè)端口更多的連接。12)send()andrecv()函數(shù):  這兩個(gè)函數(shù)用于流式套接字或者數(shù)據(jù)報(bào)套接字的通訊。如果你喜歡使用無(wú)連接的數(shù)據(jù)報(bào)套接字,你應(yīng)該看一看下面關(guān)于sendto()和recvfrom()的章節(jié)。send()是這樣的:intsend(intsockfd,constvoid*msg,intlen,intflags)。sockfd是你想發(fā)送數(shù)據(jù)的套接字描述符(或者是調(diào)用socket()或者是accept()返回的。)msg是指向你想發(fā)送的數(shù)據(jù)的指針。len是數(shù)據(jù)的長(zhǎng)度。把flags設(shè)置為0就可以了。(詳細(xì)的資料請(qǐng)看send()的manpage)。這里是一些可能的例子:char*msg=Beejwashere!。  intlen,bytes_sent。  .  .  len=strlen(msg)。  bytes_sent=send(sockfd,msg,len,0)?! ?  .  .send()返回實(shí)際發(fā)送的數(shù)據(jù)的字節(jié)數(shù)它可能小于你要求發(fā)送的數(shù)目!注意,有時(shí)候你告訴它要發(fā)送一堆數(shù)據(jù),可是它不能處理成功。它只是發(fā)送它可能發(fā)送的數(shù)據(jù),然后希望你能夠發(fā)送其它的數(shù)據(jù)。記住,如果send()返回的數(shù)據(jù)和len不匹配,你就應(yīng)該發(fā)送其它的數(shù)據(jù)。但是這里也有個(gè)好消息:如果你要發(fā)送的包很小(小于大約1K),它可能處理讓數(shù)據(jù)一次發(fā)送完。最后要說(shuō)得就是,它在錯(cuò)誤的時(shí)候返回1,并設(shè)置errno。recv()函數(shù)很相似:intrecv(intsockfd,void*buf,intlen,unsignedintflags)。sockfd是要讀的套接字描述符。buf是要讀的信息的緩沖。len是緩沖的最大長(zhǎng)度。flags可以設(shè)置為0。(請(qǐng)參考recv()的manpage。)recv()返回實(shí)際讀入緩沖的數(shù)據(jù)的字節(jié)數(shù)。或者在錯(cuò)誤的時(shí)候返回1,同時(shí)設(shè)置errno。很簡(jiǎn)單,不是嗎?你現(xiàn)在可以在流式套接字上發(fā)送數(shù)據(jù)和接收數(shù)據(jù)了。你現(xiàn)在是Unix網(wǎng)絡(luò)程序員了!13)sendto()和recvfrom()函數(shù):“這很不錯(cuò)啊”,你說(shuō),“但是你還沒有講無(wú)連接數(shù)據(jù)報(bào)套接字呢?”沒問(wèn)題,現(xiàn)在我們開始這個(gè)內(nèi)容。既然數(shù)據(jù)報(bào)套接字不是連接到遠(yuǎn)程主機(jī)的,那么在我們發(fā)送一個(gè)包之前需要什么信息呢?不錯(cuò),是目標(biāo)地址!看看下面的:intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,  conststructsockaddr*to,inttolen)。你已經(jīng)看到了,除了另外的兩個(gè)信息外,其余的和函數(shù)send()是一樣的。to是個(gè)指向數(shù)據(jù)結(jié)構(gòu)structsockaddr的指針,它包含了目的地的IP地址和端口信息。tolen可以簡(jiǎn)單地設(shè)置為sizeof(structsockaddr)。和函數(shù)send()類似,sendto()返回實(shí)際發(fā)送的字節(jié)數(shù)(它也可能小于你想要發(fā)送的字節(jié)數(shù)!),或者在錯(cuò)誤的時(shí)候返回1。相似的還有函數(shù)recv()和recvfrom()。recvfrom()的定義是這樣的:intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags, structsockaddr*from,int*fromlen)。又一次,除了兩個(gè)增加的參數(shù)外,這個(gè)函數(shù)和recv()也是一樣的。from是一個(gè)指向局部數(shù)據(jù)結(jié)構(gòu)structsockaddr的指針,它的內(nèi)容是源機(jī)器的IP地址和端口信息。fromlen是個(gè)int型的局部指針,它的初始值為sizeof(structsockaddr)。函數(shù)調(diào)用返回后,fromlen保存著實(shí)際儲(chǔ)存在from中的地址的長(zhǎng)度。recvfrom()返回收到的字節(jié)長(zhǎng)度,或者在發(fā)生錯(cuò)誤后返回1。 記住,如果你用connect()連接一個(gè)數(shù)據(jù)報(bào)套接字,你可以簡(jiǎn)單的調(diào)用send()和recv()來(lái)滿足你的要求。這個(gè)時(shí)候依然是數(shù)據(jù)報(bào)套接字,依然使用UDP,系統(tǒng)套接字接口會(huì)為你自動(dòng)加上了目標(biāo)和源的信息。14)close()和shutdown()函數(shù):  你已經(jīng)整天都在發(fā)送(send())和接收(recv())數(shù)據(jù)了,現(xiàn)在你準(zhǔn)備關(guān)閉你的套接字描述符了。這很簡(jiǎn)單,你可以使用一般的Unix文件描述符的close()函數(shù):  close(sockfd)。它將防止套接字上更多的數(shù)據(jù)的讀寫。任何在另一端讀寫套接字的企圖都將返回錯(cuò)誤信息。如果你想在如何關(guān)閉套接字上有多一點(diǎn)的控制,你可以使用函數(shù)shutdown()。它允許你將一定方向上的通訊或者雙向的通訊(就象close()一樣)關(guān)閉,你可以使用:intshutdown(intsockfd,inthow)。sockfd是你想要關(guān)閉的套接字文件描述復(fù)。how的值是下面的其中之一:  0–不允許接受  1–不允許發(fā)送  2–不允許發(fā)送和接受(和close()一樣)shutdown()成功時(shí)返回0,失敗時(shí)返回1(同時(shí)設(shè)置errno。)如果在無(wú)連接的數(shù)據(jù)報(bào)套接字中使用shutdown(),那么只不過(guò)是讓send()和recv()不能使用 (記住你在數(shù)據(jù)報(bào)套接字中使用了connect后是可以使用它們的)。15)getpeername()函數(shù):  這個(gè)函數(shù)太簡(jiǎn)單了。它太簡(jiǎn)單了,以至我都不想單列一章。但是我還是這樣做了。函數(shù)getpeername()告訴你,在連接的流式套接字上,誰(shuí)在另外一邊。函數(shù)是這樣的:includesys/intgetpeername(intsockfd,structsockaddr*addr,int*addrlen)。sockfd是連接的流式套接字的描述符。addr是一個(gè)指向結(jié)構(gòu)structsockaddr(或者是structsockaddr_in)的指針,它保存著連接的另一邊的信息。addrlen是一個(gè)int型的指針,它初始化為sizeof(structsockaddr)。函數(shù)在錯(cuò)誤的時(shí)候返回1,設(shè)置相應(yīng)的errno。一旦你獲得它們的地址,你可以使用inet_ntoa()或者gethostbyaddr()來(lái)打印或者獲得更多的信
點(diǎn)擊復(fù)制文檔內(nèi)容
職業(yè)教育相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1