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

正文內(nèi)容

socket簡易教程-資料下載頁

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。   } 注意,如果你在運行服務(wù)器之前運行客戶程序,connect()將返回Connectionrefused信息,這非常有用。 21)數(shù)據(jù)包Sockets:我不想講更多了,所以我給出代碼和 listener在機器上等待在端口4590來的數(shù)據(jù)包。talker發(fā)送數(shù)據(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)。  if((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。同時,沒有必要去使用listen()或者accept()。我們在使用無連接的數(shù)據(jù)報套接字!下面是: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)。  exit(1)?! if((he=gethostbyname(argv[1]))==NULL){/*getthehostinfo*/  herror(gethostbyname)。  exit(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)?! xit(1)。  }printf(sent%dbytesto%s\n,numbytes,inet_ntoa())。close(sockfd)。return0?!  這就是所有的了。在一臺機器上運行l(wèi)istener,然后在另外一臺機器上運行talker。觀察它們的通訊! 除了一些我在上面提到的數(shù)據(jù)套接字連接的小細節(jié)外,對于數(shù)據(jù)套接字,我還得說一些,當一個講話者呼叫connect()函數(shù)時,并指定接受者的地址時,從這點可以看出,講話者只能向connect()函數(shù)指定的地址發(fā)送和接受信息。因此,你不需要使用sendto()和recvfrom(),你完全可以用send()和recv()代替。22)阻塞:  阻塞,你也許早就聽說了。阻塞是sleep的科技行話。你可能注意到前面運行的listener程序,它在那里不停地運行,等待數(shù)據(jù)包的到來。實際在運行的是它調(diào)用recvfrom(),然后沒有數(shù)據(jù),因此recvfrom()說阻塞(block),直到數(shù)據(jù)的到來。 很多函數(shù)都利用阻塞。accept()函數(shù)阻塞,所有的recv*()函數(shù)阻塞。它們之所以能這樣做是因為它們被允許這樣做。當你第一次調(diào)用socket()建立套接字描述符的時候,內(nèi)核就將它設(shè)置為阻塞。如果你不想套接字阻塞,你就要調(diào)用函數(shù)ftl():include  include  .  .  sockfd=socket(AF_INET,SOCK_STREAM,0)?! tl(sockfd,F_SETFL,O_NONBLOCK)?! ?  .  通過設(shè)置套接字為非阻塞,你能夠有效地詢問套接字以獲得信息。如果你嘗試著從一個非阻塞的套接字讀信息并且沒有任何數(shù)據(jù),它不允許阻塞它將返回1并將errno設(shè)置EWOULDBLOCK。 但是一般說來,這種詢問不是個好主意。如果你讓你的程序在忙等狀態(tài)查詢套接字的數(shù)據(jù),你將浪費大量的CPU時間。更好的解決之道是用下一章講的select()去查詢是否有數(shù)據(jù)要讀進來。23)select()多路同步I/O:雖然這個函數(shù)有點奇怪,但是它很有用。假設(shè)這樣的情況:你是個服務(wù)器,你一邊在不停地從連接上讀數(shù)據(jù),一邊在偵聽連接上的信息。沒問題,你可能會說,不就是一個accept()和兩個recv()嗎?這么容易嗎,朋友?如果你在調(diào)用accept()的時候阻塞呢?你怎么能夠同時接受recv()數(shù)據(jù)?“用非阻塞的套接字??!”不行!你不想耗盡所有的CPU吧?那么,該如何是好?select()讓你可以同時監(jiān)視多個套接字。如果你想知道的話,那么它就會告訴你哪個套接字準備讀,哪個又準備寫,哪個套接字又發(fā)生了例外(exception)。閑話少說,下面是select():includesys/  includesys/  includeintselect(intnumfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout)。這個函數(shù)監(jiān)視一系列文件描述符,特別是readfds、writefds和exceptfds。如果你想知道你是否能夠從標準輸入和套接字描述符sockfd讀入數(shù)據(jù),你只要將文件描述符0和sockfd加入到集合readfds中。參數(shù)numfds應(yīng)該等于最高的文件描述符的值加1。在這個例子中,你應(yīng)該設(shè)置該值為sockfd+1。因為它一定大于標準輸入的文件描述符(0)。當函數(shù)select()返回的時候,readfds的值修改為:反映你選擇的哪個文件描述符可以讀。你可以用下面講到的宏FD_ISSET()來測試。在我們繼續(xù)下去之前,讓我來講講如何對這些集合進行操作。每個集合類型都是fd_set。下面有一些宏來對這個類型進行操作:FD_ZERO(fd_set*set)–清除一個文件描述符集合  FD_SET(intfd,fd_set*set)添加fd到集合  FD_CLR(intfd,fd_set*set)–從集合中移去fd  FD_ISSET(intfd,fd_set*set)–測試fd是否在集合中最后,是有點古怪的數(shù)據(jù)結(jié)構(gòu)structtimeval。有時你可不想永遠等待別人發(fā)送數(shù)據(jù)過來。也許什么事情都沒有發(fā)生的時候,你也想每隔96秒在終端上打印字符串StillGoing...。這個數(shù)據(jù)結(jié)構(gòu)允許你設(shè)定一個時間,如果時間到了,而select()還沒有找到一個準備好的文件描述符,它將返回讓你繼續(xù)處理。數(shù)據(jù)結(jié)構(gòu)structtimeval是這樣的:structtimeval{  inttv_sec。/*seconds*/  inttv_usec。/*microseconds*/  }。只要將tv_sec設(shè)置為你要等待的秒數(shù),將tv_usec設(shè)置為你要等待的微秒數(shù)就可以了。是的,是微秒而不是毫秒。1,000微秒等
點擊復(fù)制文檔內(nèi)容
職業(yè)教育相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1