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

正文內(nèi)容

socket簡(jiǎn)易教程-資料下載頁

2025-06-25 07:28本頁面
  

【正文】 hestruct*/ if(connect(sockfd,(structsockaddr*)amp。amp。their_addr,sizeof(struct sockaddr))==1){   perror(connect)。   exit(1)。   } if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==1){   perror(recv)。   exit(1)。   } buf[numbytes]=39。\039。 printf(Received:%s,buf)。 close(sockfd)。 return0。   } 注意,如果你在運(yùn)行服務(wù)器之前運(yùn)行客戶程序,connect()將返回Connectionrefused信息,這非常有用。 21)數(shù)據(jù)包Sockets:我不想講更多了,所以我給出代碼和 listener在機(jī)器上等待在端口4590來的數(shù)據(jù)包。talker發(fā)送數(shù)據(jù)包到一定的機(jī)器,它包含用戶在命令行輸入的內(nèi)容。這里就是:include  include  include  include  includesys/  includenetinet/  includesys/  includesys/defineMYPORT4950/*theportuserswillbesendingto*/defineMAXBUFLEN100main()  {  intsockfd?! tructsockaddr_inmy_addr。/*myaddressinformation*/  structsockaddr_intheir_addr。/*connector39。saddressinformation*/  intaddr_len,numbytes?! harbuf[MAXBUFLEN]。if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==1){  perror(socket)。  exit(1)?! =AF_INET。/*hostbyteorder*/  =htons(MYPORT)。/*short,networkbyteorder*/  =INADDR_ANY。/*autofillwithmyIP*/  bzero(amp。(),。/*zerotherestofthestruct*/if(bind(sockfd,(structsockaddr*)amp。my_addr,sizeof(structsockaddr))\  ==1){  perror(bind)?! xit(1)?! addr_len=sizeof(structsockaddr)?! f((numbytes=recvfrom(sockfd,buf,MAXBUFLEN,0,\  (structsockaddr*)amp。their_addr,amp。addr_len))==1){  perror(recvfrom)?! xit(1)?! printf(gotpacketfrom%s\n,inet_ntoa())?! rintf(packetis%dbyteslong\n,numbytes)?! uf[numbytes]=39。\039?! rintf(packetcontains\%s\\n,buf)。close(sockfd)。  } 注意在我們的調(diào)用socket(),我們最后使用了SOCK_DGRAM。同時(shí),沒有必要去使用listen()或者accept()。我們?cè)谑褂脽o連接的數(shù)據(jù)報(bào)套接字!下面是:include  include  include  include  includesys/  includenetinet/  includesys/  includesys/defineMYPORT4950/*theportuserswillbesendingto*/intmain(intargc,char*argv[])  {  intsockfd?! tructsockaddr_intheir_addr。/*connector39。saddressinformation*/  structhostent*he?! ntnumbytes。 if(argc!=3){  fprintf(stderr,usage:talkerhostnamemessage\n)?! xit(1)?! if((he=gethostbyname(argv[1]))==NULL){/*getthehostinfo*/  herror(gethostbyname)?! xit(1)?! if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==1){  perror(socket)?! xit(1)?! =AF_INET。/*hostbyteorder*/  =htons(MYPORT)。/*short,networkbyteorder*/  =*((structin_addr*)heh_addr)?! zero(amp。(),。/*zerotherestofthestruct*/if((numbytes=sendto(sockfd,argv[2],strlen(argv[2]),0,\  (structsockaddr*)amp。their_addr,sizeof(structsockaddr)))==1){  perror(sendto)。  exit(1)。  }printf(sent%dbytesto%s\n,numbytes,inet_ntoa())。close(sockfd)。return0?!  這就是所有的了。在一臺(tái)機(jī)器上運(yùn)行l(wèi)istener,然后在另外一臺(tái)機(jī)器上運(yùn)行talker。觀察它們的通訊! 除了一些我在上面提到的數(shù)據(jù)套接字連接的小細(xì)節(jié)外,對(duì)于數(shù)據(jù)套接字,我還得說一些,當(dāng)一個(gè)講話者呼叫connect()函數(shù)時(shí),并指定接受者的地址時(shí),從這點(diǎn)可以看出,講話者只能向connect()函數(shù)指定的地址發(fā)送和接受信息。因此,你不需要使用sendto()和recvfrom(),你完全可以用send()和recv()代替。22)阻塞:  阻塞,你也許早就聽說了。阻塞是sleep的科技行話。你可能注意到前面運(yùn)行的listener程序,它在那里不停地運(yùn)行,等待數(shù)據(jù)包的到來。實(shí)際在運(yùn)行的是它調(diào)用recvfrom(),然后沒有數(shù)據(jù),因此recvfrom()說阻塞(block),直到數(shù)據(jù)的到來。 很多函數(shù)都利用阻塞。accept()函數(shù)阻塞,所有的recv*()函數(shù)阻塞。它們之所以能這樣做是因?yàn)樗鼈儽辉试S這樣做。當(dāng)你第一次調(diào)用socket()建立套接字描述符的時(shí)候,內(nèi)核就將它設(shè)置為阻塞。如果你不想套接字阻塞,你就要調(diào)用函數(shù)ftl():include  include  .  .  sockfd=socket(AF_INET,SOCK_STREAM,0)?! tl(sockfd,F_SETFL,O_NONBLOCK)?! ?  .  通過設(shè)置套接字為非阻塞,你能夠有效地詢問套接字以獲得信息。如果你嘗試著從一個(gè)非阻塞的套接字讀信息并且沒有任何數(shù)據(jù),它不允許阻塞它將返回1并將errno設(shè)置EWOULDBLOCK。 但是一般說來,這種詢問不是個(gè)好主意。如果你讓你的程序在忙等狀態(tài)查詢套接字的數(shù)據(jù),你將浪費(fèi)大量的CPU時(shí)間。更好的解決之道是用下一章講的select()去查詢是否有數(shù)據(jù)要讀進(jìn)來。23)select()多路同步I/O:雖然這個(gè)函數(shù)有點(diǎn)奇怪,但是它很有用。假設(shè)這樣的情況:你是個(gè)服務(wù)器,你一邊在不停地從連接上讀數(shù)據(jù),一邊在偵聽連接上的信息。沒問題,你可能會(huì)說,不就是一個(gè)accept()和兩個(gè)recv()嗎?這么容易嗎,朋友?如果你在調(diào)用accept()的時(shí)候阻塞呢?你怎么能夠同時(shí)接受recv()數(shù)據(jù)?“用非阻塞的套接字啊!”不行!你不想耗盡所有的CPU吧?那么,該如何是好?select()讓你可以同時(shí)監(jiān)視多個(gè)套接字。如果你想知道的話,那么它就會(huì)告訴你哪個(gè)套接字準(zhǔn)備讀,哪個(gè)又準(zhǔn)備寫,哪個(gè)套接字又發(fā)生了例外(exception)。閑話少說,下面是select():includesys/  includesys/  includeintselect(intnumfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout)。這個(gè)函數(shù)監(jiān)視一系列文件描述符,特別是readfds、writefds和exceptfds。如果你想知道你是否能夠從標(biāo)準(zhǔn)輸入和套接字描述符sockfd讀入數(shù)據(jù),你只要將文件描述符0和sockfd加入到集合readfds中。參數(shù)numfds應(yīng)該等于最高的文件描述符的值加1。在這個(gè)例子中,你應(yīng)該設(shè)置該值為sockfd+1。因?yàn)樗欢ù笥跇?biāo)準(zhǔn)輸入的文件描述符(0)。當(dāng)函數(shù)select()返回的時(shí)候,readfds的值修改為:反映你選擇的哪個(gè)文件描述符可以讀。你可以用下面講到的宏FD_ISSET()來測(cè)試。在我們繼續(xù)下去之前,讓我來講講如何對(duì)這些集合進(jìn)行操作。每個(gè)集合類型都是fd_set。下面有一些宏來對(duì)這個(gè)類型進(jìn)行操作:FD_ZERO(fd_set*set)–清除一個(gè)文件描述符集合  FD_SET(intfd,fd_set*set)添加fd到集合  FD_CLR(intfd,fd_set*set)–從集合中移去fd  FD_ISSET(intfd,fd_set*set)–測(cè)試fd是否在集合中最后,是有點(diǎn)古怪的數(shù)據(jù)結(jié)構(gòu)structtimeval。有時(shí)你可不想永遠(yuǎn)等待別人發(fā)送數(shù)據(jù)過來。也許什么事情都沒有發(fā)生的時(shí)候,你也想每隔96秒在終端上打印字符串StillGoing...。這個(gè)數(shù)據(jù)結(jié)構(gòu)允許你設(shè)定一個(gè)時(shí)間,如果時(shí)間到了,而select()還沒有找到一個(gè)準(zhǔn)備好的文件描述符,它將返回讓你繼續(xù)處理。數(shù)據(jù)結(jié)構(gòu)structtimeval是這樣的:structtimeval{  inttv_sec。/*seconds*/  inttv_usec。/*microseconds*/  }。只要將tv_sec設(shè)置為你要等待的秒數(shù),將tv_usec設(shè)置為你要等待的微秒數(shù)就可以了。是的,是微秒而不是毫秒。1,000微秒等
點(diǎn)擊復(fù)制文檔內(nèi)容
職業(yè)教育相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1