TCP高階應用(1)阻塞與非阻塞基本概念

2021-10-06 20:28:51 字數 3022 閱讀 7020

非阻塞應用示例

傳送端**:

#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網表檢視器看看我們自己綜合出來的電路是不是自己想要的...