網路程式設計基礎 非阻塞套接字

2021-05-02 09:28:33 字數 1770 閱讀 5378

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 函式讀 取網路緩 沖區中的資料,如...