使用i/o multipexing 的網路程式設計中,一般需要採用非阻塞網路程式設計的風格,防止服務端在處理高連線量大時候阻塞在某個檔案描述符上面,比如某個socket 有大量的資料需要寫,但是核心傳送緩衝區已經填滿,無法在一次write中將需要傳送到資料傳送出去,程式就會阻塞在該處,導致select/poll/epoll_wait() 此時不能處理其它到來的請求,同樣read或者accept也可能出現阻塞的情況,比如當客戶端發起connect,之後立刻關閉該鏈結,在服務端尚未呼叫accept之前就關閉了該連線,當後來服務端accept得以呼叫此時完成佇列中又沒有完成的三次握手的連線,accept就會導致程序睡眠(詳細情況可以參見unpv1非阻塞accept的描述)。因此i/o multiplexing 一般採用非阻塞網路程式設計的風格。
對於read/wirte 操作來說,如果採用了非阻塞程式設計則需要為每個connection配備應用層緩衝區,read端主要防止一次來到資料太多,write主要防止出現阻塞,可以把沒有傳送完成的資料寫入緩衝區,等到socket 可寫之後繼續傳送。如果在新一次write請求到來的時候,應用層寫緩衝區中還有之前未傳送完的資料,則應該先將上次未寫入核心的資料寫入核心緩衝區,保證傳送到順序性。此處給乙個簡單的例子。
#include #include#include
in.h>#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
select.h>
#define sever_port 1314
#define max_line_len 1024
using
namespace
std;
int accept(int fd, struct sockaddr_in *addr)
}return
connfd;
}int read(int fd, map &bufmap)
else
if( nrcv > 0
)
else
return
nrcv;
}int getsocketerror(int
fd)
else
}int
main()
listen(listenfd,
10);
fd_zero(&rset);
fd_zero(&wrset);
fd_zero(&allset);
fd_set(listenfd,&allset);
maxfd =listenfd;
maxid = -1
;
while(1
)
if(fd_isset(listenfd, &rset))
}printf(
"client[%d] = %d\n
",ix,connfd);
if( fd_setsize ==ix)
if( connfd >maxfd)
fd_set(connfd, &allset);
accepted++;
printf(
"accepted: %d\n
",accepted);
if(ix >maxid)
if(--nready == 0
)
}for(ix = 0; ix <= maxid; ix++)
if(fd_isset(sockfd,&rset))
else
if ( nrcv > 0
)
}printf(
"nwrt = %d \n
",nwrt);
if(nwrt == nrcv) //
全部寫到了核心緩衝區
}else
//還有剩餘
}else
}if(fd_isset(sockfd,&wrset))
printf(
"write complete! \n");
}else
}if(--nready == 0
) }}
return0;
}
SQL與NoSQL MySQL與NoSQL的融合
寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...
指標與陣列 a與 a區別
假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...
apache與tomcat與weblogic對比
apache,tomcat,weblogic都是常用的中介軟體,發布 等應用都離不開這些好東東。強大程度對比apache 新手容易將apache與tomcat混亂。apache與tomcat都是同乙個公司生產的,apache是輕量級的,tomcat是企業級的。apache一般與php mysql等整...