非阻塞應用示例
傳送端**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define bufsize 128
int main(int argc,char *ar**)
server_address.sin_port=htons(7838); //使用特定埠7838
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len); //繫結ip位址
listen(server_sockfd,5); //監聽網路
printf("server wait for connect\n");
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,(socklen_t *)&client_len); //等待連線
for(i=0;i<5;i++)
memset(char_send,'\0',bufsize);
byte=recv(client_sockfd,char_send,bufsize,msg_dontwait); //非阻塞接收
if(byte>0)
else if(byte<0)
else}}
shutdown(client_sockfd,2); //關閉socket物件
shutdown(server_sockfd,2);
return 0;
}傳送端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxbuf 128
int main(int argc,char *ar**)
bzero(&dest,sizeof(dest));
dest.sin_family=af_inet;
dest.sin_port=htons(7838); // 伺服器特定埠,與伺服器設定一致
if(inet_aton(ar**[1],(struct in_addr *)&dest.sin_addr.s_addr)==0)
bzero(&mine,sizeof(mine));
mine.sin_family=af_inet;
mine.sin_port=htons(7839); //本地埠
if(inet_aton(ar**[2],(struct in_addr *)&mine.sin_addr.s_addr)==0)
if(bind(sockfd,(struct sockaddr*)&mine,sizeof(struct sockaddr))==-1) // 繫結自己的ip資訊
if(connect(sockfd,(struct sockaddr *)&dest,sizeof(dest))!=0)
if(fcntl(sockfd,f_setfl,o_nonblock)==-1) //設定為非阻塞
while(1)
else if(ret<0)
else
}memset(buffer,'\0',maxbuf+1);
printf("input message to send:");
fgets(buffer,maxbuf,stdin); //在接接收到資料後阻塞在終端,向對方傳送資料
if((ret=send(sockfd,buffer,strlen(buffer),0))==-1)
}close(sockfd); //關閉socket物件
return 0;
}》在接收資訊時是非阻塞,但是阻塞了終端,在終端無法列印資訊,但卻在接受資訊,具體實現效果如下
傳送端:
學習TCP阻塞 非阻塞
不管是阻塞還是非阻塞模式,send 返回的資料長度,只是表示拷貝到協議棧緩衝區中的資料長度,並不是實際傳送的資料量或對方接收的資料量。對於recv 只是從緩衝區中獲取接收到的資料。傳送方先將資料拷貝到協議棧緩衝區,tcp會保證緩衝區中的資料傳送到接收方的緩衝區。至於資料如何可靠的到達,底層協議已經給...
TCP非阻塞accept和非阻塞connect
非阻塞accept 當乙個已完成的連線準備好被accept的時候,select會把監聽socket標記為可讀。因此,如果用select等待外來的連線時,應該不需要把監聽socket設定為非阻塞模式,因為如果select告訴我們連線已經就緒,accept就不應該被阻塞。不過這樣做的時候有乙個bug 當...
阻塞與非阻塞賦值
李秋鳳,華清遠見嵌入式學院 講師。稍微接觸過verilog hdl的都對阻塞與非阻塞賦值略知一二,也是我們經常強調的重點之一,在課堂上還是有學員問什麼不一樣呢,為什麼我用阻塞賦值也能得出正確的結果呢?在編寫可綜合 的時候,建議大家不要忘了開啟rtl網表檢視器看看我們自己綜合出來的電路是不是自己想要的...