re: v.p.n tqsheng 2017-04-10 20:09
re: 維生素 tqsheng 2013-04-06 13:04
鈣
http://www.drugstore.com/childlife-liquid-calcium-with-magnesium-orange/qxp232131?catid=183208
http://www.drugstore.com/gnc-calcimate-plus-800-caplets-240/qxp373567?catid=183252
魚油
Nordic Naturals - Baby's DHA with Vitamin D3 - 2 fl oz
(13)
http://www.drugstore.com/nordic-naturals-babys-dha-with-vitamin-d3/qxp267804?catid=183222
維生素c
http://www.drugstore.com/gnc-vitamin-c-1000-with-bioflavonoids-and-rose-hips-tablets/qxp44135?catid=183169
銀杏
http://www.drugstore.com/gnc-herbal-plus-ginkgo-biloba-120mg-vegetarian-capsules/qxp219010?catid=183234
http://www.drugstore.com/childlife-liquid-calcium-with-magnesium-orange/qxp232131?catid=183208
http://www.drugstore.com/gnc-calcimate-plus-800-caplets-240/qxp373567?catid=183252
魚油
Nordic Naturals - Baby's DHA with Vitamin D3 - 2 fl oz
(13)
http://www.drugstore.com/nordic-naturals-babys-dha-with-vitamin-d3/qxp267804?catid=183222
維生素c
http://www.drugstore.com/gnc-vitamin-c-1000-with-bioflavonoids-and-rose-hips-tablets/qxp44135?catid=183169
銀杏
http://www.drugstore.com/gnc-herbal-plus-ginkgo-biloba-120mg-vegetarian-capsules/qxp219010?catid=183234
re: 維生素 tqsheng 2013-03-19 22:15
GNC Vitamin C Crystals 維生素粉
re: QWidget與HWND的互相轉換 tqsheng 2012-12-24 16:54
re: linux 客戶端 Socket 非阻塞connect編程(正文) tqsheng 2012-12-18 11:47
如何設置socket的Connect超時(linux)
今天發現自己的系統存在很嚴重缺陷,當前臺關閉的時候后臺就無法正常工作,原因 很好定位,后臺的socket連接超時時間過長,系統默認時間好像是75秒,于是找資料,根據下邊文章中的內容解決了,把超時時間設為5秒后,感覺好多 了。看來還有好多東西需要慢慢挖掘阿!
如何設置socket的Connect超時(linux)
[From]http://dev.cbw.com/c/c/200510195601_4292587.shtml
1. 首先將標志位設為Non-blocking模式,準備在非阻塞模式下調用connect函數
2.調用connect,正常情況下,因為TCP三次 握手需要一些時間;而非阻塞調用只要不能立即完成就會返回錯誤,所以這里會返回EINPROGRESS,表示在建立連接但還沒有完成。
3.在讀套 接口描述符集(fd_set rset)和寫套接口描述符集(fd_set wset)中將當前套接口置位(用FD_ZERO()、FD_SET()宏),并設置好超時時間(struct timeval *timeout)
4. 調用select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超 時
如果你設置的超時時間大于75秒就沒有必要這樣做了,因為內核中對connect有超時限制就是75秒。
[From]http://www.ycgczj.com.cn/34733.html
網 絡編程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口編程中,提到超時的概念,我們一下子就能想到3個:發送超時,接收超 時,以及select超時(注: select函數并不是只用于套接口的,但是套接口編程中用的比較多),在connect到目標主機的時候,這個超時是不由我們來設置的。不過正常情況下 這個超時都很長,并且connect又是一個阻塞方法,一個主機不能連接,等著connect返回還能忍受,你的程序要是要試圖連接多個主機,恐怕遇到多 個不能連接的主機的時候,會塞得你受不了的。我也廢話少說,先說說我的方法,如果你覺得你已掌握這種方法,你就不用再看下去了,如果你還不了解,我愿意與 你分享。本文是已在Linux下的程序為例子,不過拿到Windows中方法也是一樣,無非是換幾個函數名字罷了。
Linux中要給 connect設置超時,應該是有兩種方法的。一種是該系統的一些參數,這個方法我不講,因為我講不清楚:P,它也不是編程實現的。另外一種方法就是變相 的實現connect的超時,我要講的就是這個方法,原理上是這樣的:
1.建立socket
2.將該socket設置為非阻塞模式
3. 調用connect()
4.使用select()檢查該socket描述符是否可寫(注意,是可寫)
5.根據select()返回的結果 判斷connect()結果
6.將socket設置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,不過一般情況下都是用阻塞模式的, 這樣也容易管理)
如果你對網絡編程很熟悉的話,其實我一說出這個過程你就知道怎么寫你的程序了,下面給出我寫的一段程序,僅供參考。
/******************************
* Time out for connect()
* Write by Kerl W
******************************/
#include <sys/socket.h>
#include <sys/types.h>
#define TIME_OUT_TIME 20 //connect超時時間20秒
int main(int argc , char **argv)
{
………………
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) exit(1);
struct sockaddr_in serv_addr;
………//以服務器地址填充結構serv_addr
int error=-1, len;
len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctl(sockfd, FIONBIO, &ul); //設置為非阻塞模式
bool ret = false;
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
tm.tv_set = TIME_OUT_TIME;
tm.tv_uset = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0) ret = true;
else ret = false;
} else ret = false;
}
else ret = true;
ul = 0;
ioctl(sockfd, FIONBIO, &ul); //設置為阻塞模式
if(!ret)
{
close( sockfd );
fprintf(stderr , "Cannot Connect the server!n");
return;
}
fprintf( stderr , "Connected!n");
//下面還可以進行發包收包操作
……………
}
以上代碼片段, 僅供參考,也是為初學者提供一些提示,主要用到的幾個函數,select, ioctl, getsockopt都可以找到相關資料,具體用法我這里就不贅述了,你只需要在linux中輕輕的敲一個man <函數名>就能夠看到它的用法。
此外我需要說明的幾點是,雖然我們用ioctl把套接口設置為非阻塞模式,不過select本身是阻 塞的,阻塞的時間就是其超時的時間由調用select 的時候的最后一個參數timeval類型的變量指針指向的timeval結構變量來決定的,timeval結構由一個表示秒數的和一個表示微秒數 (long類型)的成員組成,一般我們設置了秒數就行了,把微妙數設為0(注:1秒等于100萬微秒)。而select函數另一個值得一提的參數就是上面 我們用到的fd_set類型的變量指針。調用之前,這個變量里面存了要用select來檢查的描述符,調用之后,針對上面的程序這里面是可寫的描述符,我 們可以用宏FD_ISSET來檢查某個描述符是否在其中。由于我這里只有一個套接口描述符,我就沒有使用FD_ISSET宏來檢查調用select之后這 個sockfd是否在set里面,其實是需要加上這個判斷的。不過我用了getsockopt來檢查,這樣才可以判斷出這個套接口是否是真的連接上了,因 為我們只是變相的用select來檢查它是否連接上了,實際上select檢查的是它是否可寫,而對于可寫,是針對以下三種條件任一條件滿足時都表示可寫 的:
1)套接口發送緩沖區中的可用控件字節數大于等于套接口發送緩沖區低潮限度的當前值,且或者i)套接口已連接,或者ii)套接口不要求連接 (UDP方式的)
2)連接的寫這一半關閉。
3)有一個套接口錯誤待處理。
這樣,我們就需要用getsockopt函數來獲取套接 口目前的一些信息來判斷是否真的是連接上了,沒有連接上的時候還能給出發生了什么錯誤,當然我程序中并沒有標出那么多狀態,只是簡單的表示可連接/不可連 接。
下面我來談談對這個程序測試的結果。我針對3種情形做了測試:
1. 目標機器網絡正常的情況
可以連接到目標主機,并能成功以 阻塞方式進行發包收包作業。
2. 目標機器網絡斷開的情況
在等待設置的超時時間(上面的程序中為20秒)后,顯示目標主機不能連接。
3. 程序運行前斷開目標機器網絡,超時時間內,恢復目標機器的網絡
在恢復目標主機網絡連接之前,程序一只等待,恢復目標主機后,程序顯示連接目標主 機成功,并能成功以阻塞方式進行發包收包作業。
以上各種情況的測試結果表明,這種設置connect超時的方法是完全可行的。我自己是把這種設置 了超時的connect封裝到了自己的類庫,用在一套監控系統中,到目前為止,運行還算正常。這種編程實現的connect超時比起修改系統參數的那種方 法的有點就在于它只用于你的程序之中而不影響系統。
今天發現自己的系統存在很嚴重缺陷,當前臺關閉的時候后臺就無法正常工作,原因 很好定位,后臺的socket連接超時時間過長,系統默認時間好像是75秒,于是找資料,根據下邊文章中的內容解決了,把超時時間設為5秒后,感覺好多 了。看來還有好多東西需要慢慢挖掘阿!
如何設置socket的Connect超時(linux)
[From]http://dev.cbw.com/c/c/200510195601_4292587.shtml
1. 首先將標志位設為Non-blocking模式,準備在非阻塞模式下調用connect函數
2.調用connect,正常情況下,因為TCP三次 握手需要一些時間;而非阻塞調用只要不能立即完成就會返回錯誤,所以這里會返回EINPROGRESS,表示在建立連接但還沒有完成。
3.在讀套 接口描述符集(fd_set rset)和寫套接口描述符集(fd_set wset)中將當前套接口置位(用FD_ZERO()、FD_SET()宏),并設置好超時時間(struct timeval *timeout)
4. 調用select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超 時
如果你設置的超時時間大于75秒就沒有必要這樣做了,因為內核中對connect有超時限制就是75秒。
[From]http://www.ycgczj.com.cn/34733.html
網 絡編程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口編程中,提到超時的概念,我們一下子就能想到3個:發送超時,接收超 時,以及select超時(注: select函數并不是只用于套接口的,但是套接口編程中用的比較多),在connect到目標主機的時候,這個超時是不由我們來設置的。不過正常情況下 這個超時都很長,并且connect又是一個阻塞方法,一個主機不能連接,等著connect返回還能忍受,你的程序要是要試圖連接多個主機,恐怕遇到多 個不能連接的主機的時候,會塞得你受不了的。我也廢話少說,先說說我的方法,如果你覺得你已掌握這種方法,你就不用再看下去了,如果你還不了解,我愿意與 你分享。本文是已在Linux下的程序為例子,不過拿到Windows中方法也是一樣,無非是換幾個函數名字罷了。
Linux中要給 connect設置超時,應該是有兩種方法的。一種是該系統的一些參數,這個方法我不講,因為我講不清楚:P,它也不是編程實現的。另外一種方法就是變相 的實現connect的超時,我要講的就是這個方法,原理上是這樣的:
1.建立socket
2.將該socket設置為非阻塞模式
3. 調用connect()
4.使用select()檢查該socket描述符是否可寫(注意,是可寫)
5.根據select()返回的結果 判斷connect()結果
6.將socket設置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,不過一般情況下都是用阻塞模式的, 這樣也容易管理)
如果你對網絡編程很熟悉的話,其實我一說出這個過程你就知道怎么寫你的程序了,下面給出我寫的一段程序,僅供參考。
/******************************
* Time out for connect()
* Write by Kerl W
******************************/
#include <sys/socket.h>
#include <sys/types.h>
#define TIME_OUT_TIME 20 //connect超時時間20秒
int main(int argc , char **argv)
{
………………
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) exit(1);
struct sockaddr_in serv_addr;
………//以服務器地址填充結構serv_addr
int error=-1, len;
len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctl(sockfd, FIONBIO, &ul); //設置為非阻塞模式
bool ret = false;
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
tm.tv_set = TIME_OUT_TIME;
tm.tv_uset = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0) ret = true;
else ret = false;
} else ret = false;
}
else ret = true;
ul = 0;
ioctl(sockfd, FIONBIO, &ul); //設置為阻塞模式
if(!ret)
{
close( sockfd );
fprintf(stderr , "Cannot Connect the server!n");
return;
}
fprintf( stderr , "Connected!n");
//下面還可以進行發包收包操作
……………
}
以上代碼片段, 僅供參考,也是為初學者提供一些提示,主要用到的幾個函數,select, ioctl, getsockopt都可以找到相關資料,具體用法我這里就不贅述了,你只需要在linux中輕輕的敲一個man <函數名>就能夠看到它的用法。
此外我需要說明的幾點是,雖然我們用ioctl把套接口設置為非阻塞模式,不過select本身是阻 塞的,阻塞的時間就是其超時的時間由調用select 的時候的最后一個參數timeval類型的變量指針指向的timeval結構變量來決定的,timeval結構由一個表示秒數的和一個表示微秒數 (long類型)的成員組成,一般我們設置了秒數就行了,把微妙數設為0(注:1秒等于100萬微秒)。而select函數另一個值得一提的參數就是上面 我們用到的fd_set類型的變量指針。調用之前,這個變量里面存了要用select來檢查的描述符,調用之后,針對上面的程序這里面是可寫的描述符,我 們可以用宏FD_ISSET來檢查某個描述符是否在其中。由于我這里只有一個套接口描述符,我就沒有使用FD_ISSET宏來檢查調用select之后這 個sockfd是否在set里面,其實是需要加上這個判斷的。不過我用了getsockopt來檢查,這樣才可以判斷出這個套接口是否是真的連接上了,因 為我們只是變相的用select來檢查它是否連接上了,實際上select檢查的是它是否可寫,而對于可寫,是針對以下三種條件任一條件滿足時都表示可寫 的:
1)套接口發送緩沖區中的可用控件字節數大于等于套接口發送緩沖區低潮限度的當前值,且或者i)套接口已連接,或者ii)套接口不要求連接 (UDP方式的)
2)連接的寫這一半關閉。
3)有一個套接口錯誤待處理。
這樣,我們就需要用getsockopt函數來獲取套接 口目前的一些信息來判斷是否真的是連接上了,沒有連接上的時候還能給出發生了什么錯誤,當然我程序中并沒有標出那么多狀態,只是簡單的表示可連接/不可連 接。
下面我來談談對這個程序測試的結果。我針對3種情形做了測試:
1. 目標機器網絡正常的情況
可以連接到目標主機,并能成功以 阻塞方式進行發包收包作業。
2. 目標機器網絡斷開的情況
在等待設置的超時時間(上面的程序中為20秒)后,顯示目標主機不能連接。
3. 程序運行前斷開目標機器網絡,超時時間內,恢復目標機器的網絡
在恢復目標主機網絡連接之前,程序一只等待,恢復目標主機后,程序顯示連接目標主 機成功,并能成功以阻塞方式進行發包收包作業。
以上各種情況的測試結果表明,這種設置connect超時的方法是完全可行的。我自己是把這種設置 了超時的connect封裝到了自己的類庫,用在一套監控系統中,到目前為止,運行還算正常。這種編程實現的connect超時比起修改系統參數的那種方 法的有點就在于它只用于你的程序之中而不影響系統。
re: linux 客戶端 Socket 非阻塞connect編程(正文) tqsheng 2012-12-18 11:46
對于面向連接的socket類型(SOCK_STREAM,SOCK_SEQPACKET)在讀寫數據之前必須建立連接,首先服務器端socket必須在一個客戶端知道的地址進行監聽,也就是創建socket之后必須調用bind綁定到一個指定的地址,然后調用int listen(int sockfd, int backlog);進行監聽。此時服務器socket允許客戶端進行連接,backlog提示沒被accept的客戶連接請求隊列的大小,系統決定實際的值,最大值定義為SOMAXCONN在頭文件<sys/socket.h>里面。如果某種原因導致服務器端進程未及時accpet客戶連接而導致此隊列滿了的話則新的客戶端連接請求被拒絕(在工作中遇到過此情況,IONA ORBIX(CORBA中間件)由于沒有配置超時時間結果在WIFI網絡中傳輸數據出現異常情況一直阻塞而無機會調用accept接受新的客戶請求,于是最終隊列滿導致新的客戶連接被拒絕)。
調用listen之后當有客戶端連接到達的時候調用int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);接受客戶端連接建立起連接返回用于連接數據傳送的socket描述符,進行監聽的socket可以用于繼續監聽客戶端的連接請求,返回的socket描述符跟監聽的socket類型一致。如果addr不為NULL,則客戶端發起連接請求的socket地址信息會通過addr進行返回。如果監聽的socket描述符為阻塞模式則accept一直會阻塞直到有客戶發起連接請求,如果監聽的socket描述符為非阻塞模式則如果當前沒有可用的客戶連接請求,則返回-1(errno設置為EAGAIN)。可以使用select函數對監聽的socket描述符進行多路分離,如果有客戶連接請求則select將監聽的socket描述符設置為可讀(注意,如果監聽的socket為阻塞模式而使用select進行多路分離則可能造成select返回可讀但是調用accept會被阻塞住的情況,原因是在調用accept之前客戶端可能主動關閉連接或者發送RST異常關閉連接,因此select最好跟非阻塞socket搭配使用)。
客戶端調用int connect(int sockfd, const struct sockaddr *addr, socklen_t len);發起對服務器的socket的連接請求,如果客戶端socket描述符為阻塞模式則會一直阻塞到連接建立或者連接失敗(注意阻塞模式的超時時間可能為75秒到幾分鐘之間),而如果為非阻塞模式,則調用connect之后如果連接不能馬上建立則返回-1(errno設置為EINPROGRESS,注意連接也可能馬上建立成功比如連接本機的服務器進程),如果沒有馬上建立返回,此時TCP的三路握手動作在背后繼續,而程序可以做其他的東西,然后調用select檢測非阻塞connect是否完成(此時可以指定select的超時時間,這個超時時間可以設置為比connect的超時時間短),如果select超時則關閉socket,然后可以嘗試創建新的socket重新連接,如果select返回非阻塞socket描述符可寫則表明連接建立成功,如果select返回非阻塞socket描述符既可讀又可寫則表明連接出錯(注意:這兒必須跟另外一種連接正常的情況區分開來,就是連接建立好了之后,服務器端發送了數據給客戶端,此時select同樣會返回非阻塞socket描述符既可讀又可寫,這時可以通過以下方法區分:
1.調用getpeername獲取對端的socket地址.如果getpeername返回ENOTCONN,表示連接建立失敗,然后用SO_ERROR調用getsockopt得到套接口描述符上的待處理錯誤;
2.調用read,讀取長度為0字節的數據.如果read調用失敗,則表示連接建立失敗,而且read返回的errno指明了連接失敗的原因.如果連接建立成功,read應該返回0;
3.再調用一次connect.它應該失敗,如果錯誤errno是EISCONN,就表示套接口已經建立,而且第一次連接是成功的;否則,連接就是失敗的;
對于無連接的socket類型(SOCK_DGRAM),客戶端也可以調用connect進行連接,此連接實際上并不建立類似SOCK_STREAM的連接,而僅僅是在本地保存了對端的地址,這樣后續的讀寫操作可以默認以連接的對端為操作對象。
當對端機器crash或者網絡連接被斷開(比如路由器不工作,網線斷開等),此時發送數據給對端然后讀取本端socket會返回ETIMEDOUT或者EHOSTUNREACH 或者ENETUNREACH(后兩個是中間路由器判斷服務器主機不可達的情況)。
當對端機器crash之后又重新啟動,然后客戶端再向原來的連接發送數據,因為服務器端已經沒有原來的連接信息,此時服務器端回送RST給客戶端,此時客戶端讀本地端口返回ECONNRESET錯誤。
當服務器所在的進程正常或者異常關閉時,會對所有打開的文件描述符進行close,因此對于連接的socket描述符則會向對端發送FIN分節進行正常關閉流程。對端在收到FIN之后端口變得可讀,此時讀取端口會返回0表示到了文件結尾(對端不會再發送數據)。
當一端收到RST導致讀取socket返回ECONNRESET,此時如果再次調用write發送數據給對端則觸發SIGPIPE信號,信號默認終止進程,如果忽略此信號或者從SIGPIPE的信號處理程序返回則write出錯返回EPIPE。
可以看出只有當本地端口主動發送消息給對端才能檢測出連接異常中斷的情況,搭配select進行多路分離的時候,socket收到RST或者FIN時候,select返回可讀(心跳消息就是用于檢測連接的狀態)。也可以使用socket的KEEPLIVE選項,依賴socket本身偵測socket連接異常中斷的情況。
發送socket數據有以下方法:
調用ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);,只能用于建立好了連接的socket(面向連接的SOCK_STREAM或者調用了connect的SOCK_DGRAM)。flags取值如下:
MSG_DONTROUTE 對數據不進行路由
MSG_DONTWAIT 不等待數據發送完成
MSG_EOR 數據包結尾
MSG_OOB 帶外數據
注意send函數成功返回并不代表對端一定收到了發送的消息,另外對于數據報協議如果發送的數據大于一個數據報長度則發送失敗(errno設置為EMSGSIZE)。
調用listen之后當有客戶端連接到達的時候調用int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);接受客戶端連接建立起連接返回用于連接數據傳送的socket描述符,進行監聽的socket可以用于繼續監聽客戶端的連接請求,返回的socket描述符跟監聽的socket類型一致。如果addr不為NULL,則客戶端發起連接請求的socket地址信息會通過addr進行返回。如果監聽的socket描述符為阻塞模式則accept一直會阻塞直到有客戶發起連接請求,如果監聽的socket描述符為非阻塞模式則如果當前沒有可用的客戶連接請求,則返回-1(errno設置為EAGAIN)。可以使用select函數對監聽的socket描述符進行多路分離,如果有客戶連接請求則select將監聽的socket描述符設置為可讀(注意,如果監聽的socket為阻塞模式而使用select進行多路分離則可能造成select返回可讀但是調用accept會被阻塞住的情況,原因是在調用accept之前客戶端可能主動關閉連接或者發送RST異常關閉連接,因此select最好跟非阻塞socket搭配使用)。
客戶端調用int connect(int sockfd, const struct sockaddr *addr, socklen_t len);發起對服務器的socket的連接請求,如果客戶端socket描述符為阻塞模式則會一直阻塞到連接建立或者連接失敗(注意阻塞模式的超時時間可能為75秒到幾分鐘之間),而如果為非阻塞模式,則調用connect之后如果連接不能馬上建立則返回-1(errno設置為EINPROGRESS,注意連接也可能馬上建立成功比如連接本機的服務器進程),如果沒有馬上建立返回,此時TCP的三路握手動作在背后繼續,而程序可以做其他的東西,然后調用select檢測非阻塞connect是否完成(此時可以指定select的超時時間,這個超時時間可以設置為比connect的超時時間短),如果select超時則關閉socket,然后可以嘗試創建新的socket重新連接,如果select返回非阻塞socket描述符可寫則表明連接建立成功,如果select返回非阻塞socket描述符既可讀又可寫則表明連接出錯(注意:這兒必須跟另外一種連接正常的情況區分開來,就是連接建立好了之后,服務器端發送了數據給客戶端,此時select同樣會返回非阻塞socket描述符既可讀又可寫,這時可以通過以下方法區分:
1.調用getpeername獲取對端的socket地址.如果getpeername返回ENOTCONN,表示連接建立失敗,然后用SO_ERROR調用getsockopt得到套接口描述符上的待處理錯誤;
2.調用read,讀取長度為0字節的數據.如果read調用失敗,則表示連接建立失敗,而且read返回的errno指明了連接失敗的原因.如果連接建立成功,read應該返回0;
3.再調用一次connect.它應該失敗,如果錯誤errno是EISCONN,就表示套接口已經建立,而且第一次連接是成功的;否則,連接就是失敗的;
對于無連接的socket類型(SOCK_DGRAM),客戶端也可以調用connect進行連接,此連接實際上并不建立類似SOCK_STREAM的連接,而僅僅是在本地保存了對端的地址,這樣后續的讀寫操作可以默認以連接的對端為操作對象。
當對端機器crash或者網絡連接被斷開(比如路由器不工作,網線斷開等),此時發送數據給對端然后讀取本端socket會返回ETIMEDOUT或者EHOSTUNREACH 或者ENETUNREACH(后兩個是中間路由器判斷服務器主機不可達的情況)。
當對端機器crash之后又重新啟動,然后客戶端再向原來的連接發送數據,因為服務器端已經沒有原來的連接信息,此時服務器端回送RST給客戶端,此時客戶端讀本地端口返回ECONNRESET錯誤。
當服務器所在的進程正常或者異常關閉時,會對所有打開的文件描述符進行close,因此對于連接的socket描述符則會向對端發送FIN分節進行正常關閉流程。對端在收到FIN之后端口變得可讀,此時讀取端口會返回0表示到了文件結尾(對端不會再發送數據)。
當一端收到RST導致讀取socket返回ECONNRESET,此時如果再次調用write發送數據給對端則觸發SIGPIPE信號,信號默認終止進程,如果忽略此信號或者從SIGPIPE的信號處理程序返回則write出錯返回EPIPE。
可以看出只有當本地端口主動發送消息給對端才能檢測出連接異常中斷的情況,搭配select進行多路分離的時候,socket收到RST或者FIN時候,select返回可讀(心跳消息就是用于檢測連接的狀態)。也可以使用socket的KEEPLIVE選項,依賴socket本身偵測socket連接異常中斷的情況。
發送socket數據有以下方法:
調用ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);,只能用于建立好了連接的socket(面向連接的SOCK_STREAM或者調用了connect的SOCK_DGRAM)。flags取值如下:
MSG_DONTROUTE 對數據不進行路由
MSG_DONTWAIT 不等待數據發送完成
MSG_EOR 數據包結尾
MSG_OOB 帶外數據
注意send函數成功返回并不代表對端一定收到了發送的消息,另外對于數據報協議如果發送的數據大于一個數據報長度則發送失敗(errno設置為EMSGSIZE)。
re: Visual Studio Team System 2008 tqsheng 2012-12-05 22:09
另附cd-key一個:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T(不知道是否管用,請有心人測試一下,90days-trial版本換了這個cd-key是否可以去掉90days的限制,謝謝了
re: qt 不錯的blog tqsheng 2012-12-05 17:31
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 22:49
深圳市榮通達科技有限公司
聯系人:鄒軍 鋪主12小時內維護過該信息
手機:13670121811 聯系我時,請告知來自一呼百應B2B搜索引擎!
電話:0755-81507330
傳真:0755-81507330
電子郵箱:akzj331@163.com
聯系地址:深圳寶安區西鄉街道三圍村裕興第二科技園B棟
聯系人:鄒軍 鋪主12小時內維護過該信息
手機:13670121811 聯系我時,請告知來自一呼百應B2B搜索引擎!
電話:0755-81507330
傳真:0755-81507330
電子郵箱:akzj331@163.com
聯系地址:深圳寶安區西鄉街道三圍村裕興第二科技園B棟
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 22:10
實時監視圖象分辨率
176*144(QCIF),352*288(CIF),704*288(2CIF),528*384(DCIF),704*576(D1);
176*144(QCIF),352*288(CIF),704*288(2CIF),528*384(DCIF),704*576(D1);
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 22:08
稱:深圳市榮通達科技有限公司
聯系人:鄒軍 鋪主12小時內維護過該信息
手機:13670121811 聯系我時,請告知來自一呼百應B2B搜索引擎!
電話:0755-81507330
傳真:0755-81507330
電子郵箱:akzj331@163.com
聯系地址:深圳寶安區西鄉街道三圍村裕興第二科技園B棟
聯系人:鄒軍 鋪主12小時內維護過該信息
手機:13670121811 聯系我時,請告知來自一呼百應B2B搜索引擎!
電話:0755-81507330
傳真:0755-81507330
電子郵箱:akzj331@163.com
聯系地址:深圳寶安區西鄉街道三圍村裕興第二科技園B棟
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 22:07
企業名稱:深圳市萊安科技有限公司
經營模式:生產型
聯 系 人:陳莉
聯系電話:0755-86180065
地址:深圳市南山區西麗北路80號
經營模式:生產型
聯 系 人:陳莉
聯系電話:0755-86180065
地址:深圳市南山區西麗北路80號
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 22:05
聯系人:西安志誠電子有限責任公司
地 址:雁塔路中段33號
電 話:02985521188
地 址:雁塔路中段33號
電 話:02985521188
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 22:03
吉林省蘭新恒遠電子科技有限公司
公司地址:吉林省長春市凈月開發區小合臺工業區5期
聯系電話:0431-81038560
傳 真:0431-81038560-16
Q Q: 471711237
電子郵箱:lanxin_1992@163.com
網址:www.lxhy.com.cn
公司地址:吉林省長春市凈月開發區小合臺工業區5期
聯系電話:0431-81038560
傳 真:0431-81038560-16
Q Q: 471711237
電子郵箱:lanxin_1992@163.com
網址:www.lxhy.com.cn
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 21:56
所在地區: 廣東/深圳
聯 系 人: 劉勝華
聯系電話: 0755-84198179
手 機: 13728627487
聯系傳真: 0755-81781696
電子郵件: ipwifi@ipwifi.cn
公司網址: http://www.ipwifi.cn
地 址: 深圳市龍崗區坂田街道坂田中心大廈六樓
郵 編: 518129
聯 系 人: 劉勝華
聯系電話: 0755-84198179
手 機: 13728627487
聯系傳真: 0755-81781696
電子郵件: ipwifi@ipwifi.cn
公司網址: http://www.ipwifi.cn
地 址: 深圳市龍崗區坂田街道坂田中心大廈六樓
郵 編: 518129
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 21:55
注冊日期:2010-05-13
服務公司: 廣州視捷視訊科技有限公司
用戶等級:普通會員
在線聯系:發短消息
聯系電話:86-020-85698485
聯系人:張兵
MSN:
QQ:
聯系傳真:86-020-85523746
Email:87566550@126.com
地址:中國廣東廣州市廣州市天河區黃埔大道中221號406室
手機:13826160986
RSS訂閱:訂閱或放入博客
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-21 21:49
深圳市偉福特科技有限公司
地址:廣東省深圳市寶安區龍華民冶東邊商業大廈507
工廠:深圳龍華民治東美大廈5層
國內招商業務: <黃青青 >
全國24小時招商熱線: 0755—21889886
手機: 13794483411
傳真:0755-29165211
QQ:447474906
郵編: 518131
網址:
http://www.szvfd.cn
淘寶網:http://shop35671758.taobao.com
地址:廣東省深圳市寶安區龍華民冶東邊商業大廈507
工廠:深圳龍華民治東美大廈5層
國內招商業務: <黃青青 >
全國24小時招商熱線: 0755—21889886
手機: 13794483411
傳真:0755-29165211
QQ:447474906
郵編: 518131
網址:
http://www.szvfd.cn
淘寶網:http://shop35671758.taobao.com
re: 同時支持COFDM本地自建無線網絡和3G公網的無線信號傳輸方式 tqsheng 2012-11-20 20:47
上海興立安防技術有限公司
吉克 市場部銷售總監電話:86-021-51089832手機:13816267766 傳真:0086-021-51089832-8000
re: 視頻 tqsheng 2012-11-18 23:44
:18601022181
15810485646公司地址:北京市海淀區成府路298號中關村方正大廈6層聯 系 人:韓予諶 孫翰苑
15810485646公司地址:北京市海淀區成府路298號中關村方正大廈6層聯 系 人:韓予諶 孫翰苑
re: 網絡文件中轉站 tqsheng 2012-11-16 23:58
re: 網絡文件中轉站 tqsheng 2012-11-16 23:58
re: http://www.microisv.com/ tqsheng 2012-10-24 21:16
re: 維生素 tqsheng 2012-10-05 14:01
護眼
Nature's Way Ginkgold® Eyes -
Nature's Way Ginkgold® Eyes -
re: 維生素 tqsheng 2012-10-05 12:22
re: 維生素 tqsheng 2012-10-05 10:16
GNC 銀杏精華Ginkgo Biloba 120mg 100粒
re: 控件網 tqsheng 2012-06-24 10:59
Softgroup.NET.Bars.Controls.v5.0.4556.Incl.Keygen-BEAN
Softgroup.NET.Multimedia.Control.v4.0.4556.Incl.Keygen-BEAN
Softgroup.NET.Progress.Bar.v5.0.4099.Incl.Keygen-BEAN
Softgroup.NET.Multimedia.Control.v4.0.4556.Incl.Keygen-BEAN
Softgroup.NET.Progress.Bar.v5.0.4099.Incl.Keygen-BEAN
re: 網絡文件中轉站 tqsheng 2012-01-02 15:24
reget.it
re: 網絡文件中轉站 tqsheng 2012-01-02 15:24
tenacy.home.kg/public
re: 快捷鍵 tqsheng 2011-12-14 23:23
VA
ALT+G : 定義和引用間相互切換
ALT+O: .H和.c 跳轉
ALT+SHIFT+Q : 創建聲明定義
ALT+SHIFT+R: 批量重改名
ALT+SHIFT+S: 定位對象和變量
ALT+SHIFT+O: 定位文件
ALT+SHIFT+F: 找出所有引用
http://wenku.baidu.com/view/e5e7856a25c52cc58bd6be98.html
ALT+G : 定義和引用間相互切換
ALT+O: .H和.c 跳轉
ALT+SHIFT+Q : 創建聲明定義
ALT+SHIFT+R: 批量重改名
ALT+SHIFT+S: 定位對象和變量
ALT+SHIFT+O: 定位文件
ALT+SHIFT+F: 找出所有引用
http://wenku.baidu.com/view/e5e7856a25c52cc58bd6be98.html
re: 工具 tqsheng 2011-10-25 22:04
另外還有個工具叫AdRestore
Restore deleted objects on Windows Server 2003 domains.
http://technet.microsoft.com/zh-cn/sysinternals/bb963907(en-us).aspx
re: 工具 tqsheng 2011-10-25 22:03
終于找到一個可以查看隱藏容器的工具:Active Directory Explorer
re: 5F導引導管 tqsheng 2011-09-19 12:26
上海銘程貿易有限公司 查看招聘中的職位>>
公司行業: 醫療設備/器械 醫療/護理/衛生
公司性質: 民營公司
公司規模: 少于50人
銘程貿易有限公司是一家以醫療器械為主體的專業代理公司,是強生Codman公司神經介入產品的上海、蘇南、浙北獨家經銷商。現已與長海、華山等眾多知名醫院建立了較完整的經營渠道。伴隨Codman 創新產品Mircus生物圈的上市,團隊業務在迅速不斷擴大,基于公司發展需求,基于上海工作需求,現誠聘人員與公司一起發展
符合條件者請附上:個人簡歷、薪資要求及一寸近照(必須)。合則約見,勿電勿訪。
地 址:上海市中山南二路481號21號樓 (地鐵四號線,大木橋路站三號出口,步行5分鐘即可到達)
郵政編碼:200032
聯 系 人:人事部 趙小姐
電子郵箱:hrsh2000@163.com
聯 系 人:趙小姐
地 址:上海市徐匯區中山南二路481號21號樓(地鐵四號直達)
公司行業: 醫療設備/器械 醫療/護理/衛生
公司性質: 民營公司
公司規模: 少于50人
銘程貿易有限公司是一家以醫療器械為主體的專業代理公司,是強生Codman公司神經介入產品的上海、蘇南、浙北獨家經銷商。現已與長海、華山等眾多知名醫院建立了較完整的經營渠道。伴隨Codman 創新產品Mircus生物圈的上市,團隊業務在迅速不斷擴大,基于公司發展需求,基于上海工作需求,現誠聘人員與公司一起發展
符合條件者請附上:個人簡歷、薪資要求及一寸近照(必須)。合則約見,勿電勿訪。
地 址:上海市中山南二路481號21號樓 (地鐵四號線,大木橋路站三號出口,步行5分鐘即可到達)
郵政編碼:200032
聯 系 人:人事部 趙小姐
電子郵箱:hrsh2000@163.com
聯 系 人:趙小姐
地 址:上海市徐匯區中山南二路481號21號樓(地鐵四號直達)
re: 5F導引導管 tqsheng 2011-09-19 11:21