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...