1.非阻塞網路程式--伺服器端
由於套接字是一種特殊的檔案,因此,可以使用更改檔案阻塞狀態的方法修改套接字的阻塞狀態。
當套接字被設定為非阻塞狀態時,如果對資料暫不可用的套接字進行讀寫操作,讀寫函式會返回-1,並置errno為eagain,表示當前資料不可用。
下例同樣演示大小寫字母轉換的程式。
//server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max_line 100
void my_fun(char * p)
int main()
if(bind(s_fd,(struct sockaddr * )&sin,sizeof(sin))==-1)
flags=fcntl(sock_fd,f_getfl);
flags |=o_nonblock;//設定套接字為非阻塞套接字的標誌
if(fcntl(sock_fd,f_setfl,flags)==-1)
while(1)else if(errrno=eagain)
printf("socket are not ready now/n");
inet_ntop(af_inet,&cin.sin_addr,addr_p,sizeof(addr_p));
printf("client ip is %s,port is %d/n",addr_p,ntohs(cin.sin_port));
printf("content is:%s/n",buf);
my_fun(buf);
n=sendto(s_fd,buf,n,0,(struct sockaddr *)&cin,addr_len);
if(n==-1&&errno!=eagain)else if(errno==eagain)
printf("socket are not ready now/n");
}if(close(s_fd)==-1)
return 0;
}2.非阻塞網路程式--客戶端
//client.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max_line 100
int main()
if(fgets(buf,maxline,stdin)==null)
n==sendto(s_fd,buf,strlen(str)+1,0,(struct sockaddr *) &sin,sizeof(sin));
if(n==-1)
addr_len=sizeof(cin);
n=recvfrom(s_fd,buf,maax_line,0,(struct sockaddr *)&cin,&addr_len);
if(n==-1)else
printf("receive from server:%s/n",buf);
if(close(s_fd)==-1)
return 0;
}
非阻塞套接字
建立socket服務端 server socket.socket 設定非阻塞 server.setblocking false 繫結ip和埠 server.bind 6969 監聽 server.listen 5 存放連線進來的客戶端 client list accept 和recv 方法,設定非阻...
非阻塞套接字
開始之前,需要先了解一下什麼會引起程序阻塞和喚醒的事件 1 向系統請求共享資源失敗。程序在向系統請求共享資源時,由於系統已無足夠的資源分配給它,此時程序因不能繼續執行而轉變為阻塞狀態。2 等待某種操作的完成。當程序啟動某種操作後,如果該程序必須在該操作完成之後才能繼續執行,則先將該程序阻塞起來以等待...
同步,非同步,阻塞套接字,非阻塞套接字
同 步指的是 傳送方不等接收方響 應,便接著 發下個資料報的通訊方式 異 步指傳送方 發出資料後,等收到接收方 發回的響應,才 發下乙個資料報的通訊方式。阻塞套接字是指執 行此套接字的網路呼叫 時,直到成功才返回,否 則一直阻塞在此網 絡呼叫上,比如呼叫 recv 函式讀 取網路緩 沖區中的資料,如...