Linux網路程式設計(三) IO非阻塞操作

2021-06-16 07:41:10 字數 1884 閱讀 6036

io非阻塞操作

sock的方法不一定非得是阻塞的,也可以非阻塞的操作。有兩種方法分別為設定fcntl 和設定相應函式的引數。

服務端:

#include #include #include #include #include #include #include #include #define  bufsize 128

int main(int argc,char *argv)

listen(server_sockfd, 5);

printf("server waiting 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);

shutdown(server_sockfd,2);

}

客戶端:

#include #include #include #include #include #include #include #include #include #include #define maxbuf 128

int main(int argc, char **argv)

bzero(&dest, sizeof(dest));

dest.sin_family = af_inet;

dest.sin_port = htons(7838);

if(argc<2)

if (inet_aton(argv[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(argv[2], (struct in_addr *) &mine.sin_addr.s_addr) == 0)

if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) == -1)

printf("will connect!\n");

if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0)

//設定sock連線的非阻塞

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);

return 0;

}

本篇部落格出自 

阿修羅道

Linux網路程式設計(九) 非阻塞式I O

套接字的預設狀態是阻塞的。當發出乙個不能立即完成的套接字呼叫時,其程序將被投入到睡眠,等待相應操作完成。可能阻塞的套接字呼叫可分為以下四類 1 輸入操作,包括read readv recv recvfrom和recvmsg等5個函式 對於非阻塞的套接字,如果輸入操作不能被滿足,相應的呼叫立即返回乙個...

網路程式設計之IO模型 非阻塞IO

linux下,可以通過設定socket使其變為non blocking。當對乙個non blocking socket執行讀操作時,流程是這個樣子 從圖中可以看出,當使用者程序發出read操作時,如果kernel中的資料還沒有準備好,那麼它並不會block使用者程序,而是立刻返回乙個error。從使...

linux 網路程式設計 三 非阻塞通訊select

int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 說明 int maxfdp是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1。fd set r...