菜鳥散百分,求教以下幾個通信方面的簡單問題,望高手不吝賜教!!!UP有分!


本人使用VxWorks,阻塞狀態下,有以下幾個通信方面的問題困惑:
(應該使用其它通信方面操作系統的高手都可以回答)

1、select函數的返回。
   問:select函數的返回值應該有哪幾種情況?分別代表什么意思?
   幫助上說:-1表示出錯;0表示超時;大於0則表示連通。
   我的系統在連接客戶端后,select的返回為1;可人為的斷開后,竟然返回2!
   為什么???

2、接收數據的問題。
   問:客戶端連接上后,阻塞狀態下,使用接收數據的函數會堵住。
   可為什么人為的斷掉客戶端后,接收函數就不堵了?(我用的循環。)每次都接收數據,而且返回的接收數據長度為0。
   為什么???怎么樣才能讓它繼續堵住???

3、VxWorks下有個延時函數taskDelay,為什么“taskDelay(sysClkRateGet() * 0.02);”這樣的語句會一直延時下去?是不是不能用小數?而只能用“taskDelay(sysClkRateGet() /50);”才行???

多謝各位了!!!

14 个解决方案

#1


我是新學的網絡編程,我覺的當網絡斷開后原先開的SOCKET都無效了,導致RECV無法阻塞.你可以設置超退出循環

#2


你可以設置超時退出循環

#3


通常接收和發送都是阻塞的,所以長時間通訊,最好另外使用一個線程來出來網絡通訊。

#4


呵呵! UP!

#5


up

#6


1.extract from MSDN:
The select function returns the total number of socket handles that are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.

#7


捧場 & 蹭分!

#8


1 vxworks下
select函數
int select
    (
    int              width,      /* number of bits to examine from 0 */
    fd_set *         pReadFds,   /* read fds */
    fd_set *         pWriteFds,  /* write fds */
    fd_set *         pExceptFds, /* exception fds (unsupported) */
    struct timeval * pTimeOut    /* max time to wait, NULL = forever */
    )
返回值
The number of file descriptors with activity, 0 if timed out, or ERROR if an error occurred when the driver's select( ) routine was invoked via ioctl( ). 

3、只能用整數
taskDelay函數是這樣的
STATUS taskDelay
    (
    int ticks /* number of ticks to delay task */
    )

#9


UP

#10


lelezhang(浪上行雲):VxWorks的幫助我看了N遍了!
主要是因為與實際情況不符合,所以才有疑問的。

select這個函數,關於socket的編程,一般都會用到它。
我在網上查看了好多例子,都是返回值大於0的情況下,就是正常的。

正是因為我斷開通信后,返回為2,所以才對幫助開始懷疑的。

當然了,幫助應該不可能是錯誤的。

所以我想問的是:返回值到底代表什么意思?

可讀返回1?可寫也返回1?既可讀又可寫,所以返回2?
還是不可讀返回1?不可寫也返回1?既不可讀又不可寫,所以返回2?

盼各位高手作答!

#11


up

#12


人為斷開網絡,好想SOCKET檢測不出來,會出現一些問題。所以通常加入心跳測試報文。

#13


本人使用VxWorks,阻塞狀態下,有以下幾個通信方面的問題困惑:
(應該使用其它通信方面操作系統的高手都可以回答)

1、select函數的返回。
   問:select函數的返回值應該有哪幾種情況?分別代表什么意思?
   幫助上說:-1表示出錯;0表示超時;大於0則表示連通。
   我的系統在連接客戶端后,select的返回為1;可人為的斷開后,竟然返回2!
   為什么???

SELECT的返回1表示在設定時間內得到響應.0表示TIMEOUT
SOCKET    正常時,如果沒有收到數據,RECV返回0,
          嘗試寫數據立刻發現是正常,SEND返回1

SOCKET  不正常時,RECV異常,返回1
        嘗試寫立刻發現是異常的,返回1
1表示立刻發現結果,可能正常可能異常.
0表示在規定時間內沒有發現結果


2、接收數據的問題。
   問:客戶端連接上后,阻塞狀態下,使用接收數據的函數會堵住。
   可為什么人為的斷掉客戶端后,接收函數就不堵了?(我用的循環。)每次都接收數據,而且返回的接收數據長度為0。
   為什么???怎么樣才能讓它繼續堵住???

斷掉的SOCKET不會在RECV下堵住,只有正常的才會堵住.

3、VxWorks下有個延時函數taskDelay,為什么“taskDelay(sysClkRateGet() * 0.02);”這樣的語句會一直延時下去?是不是不能用小數?而只能用“taskDelay(sysClkRateGet() /50);”才行???

參數是整數才行,是小數會出錯.
sysClkRateGet() 的值是60;
sysClkRateGet() * 0.02按照C的語法 是小數,出錯
sysClkRateGet() /50按照C的語法是整數,正常.

#14


關注

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com