1. 程式人生 > >linux 下setsockopt(),connect()相關錯誤程式碼的值及使用

linux 下setsockopt(),connect()相關錯誤程式碼的值及使用

功能描述:

        獲取或者設定與某個套接字關聯的選 項。選項可能存在於多層協議中,它們總會出現在最上面的套接字層。當操作套接字選項時,

選項位於的層和選項的名稱必須給出。為了操作套接字層的選項,應該 將層的值指定為SOL_SOCKET。為了操作其它層的選項,控制選

項的合適協議號必須給出。例如,為了表示一個選項由TCP協議解析,層應該設定為協議 號TCP。


用法:
#include <sys/types.h>
#include <sys/socket.h>

3.在send(),recv()過程中有時由於網路狀況等原因,發收不能預期進行,而設定收發時限:int nNetTimeout=1000;//1秒
//傳送時限setsockopt(socket,SOL_S0CKET, SO_SNDTIMEO, (char *)&nNetTimeout,sizeof(int));//接收時限setsockopt(socket,SOL_S0CKET, SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
這樣做在Linux環境下是不會產生效果的須如下定義struct timeval timeout = {3,0}; 
//設定傳送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//設定接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

引數:  
sock:將要被設定或者獲取選項的套接字。
level:選項所在的協議層。
optname:需要訪問的選項名。
optval:對於getsockopt(),指向返回選項值的緩衝。對於setsockopt(),指向包含新選項值的緩衝。
optlen:對於getsockopt(),作為入口引數時,選項值的最大長度。作為出口引數時,選項值的實際長度。對於setsockopt(),現選項的長度。


返回說明: 


成功執行時,返回0。失敗返回-1,errno被設為以下的某個值  
EBADF:sock不是有效的檔案描述詞
EFAULT:optval指向的記憶體並非有效的程序空間
EINVAL:在呼叫setsockopt()時,optlen無效
ENOPROTOOPT:指定的協議層不能識別選項
ENOTSOCK:sock描述的不是套接字

引數詳細說明:

level指定控制套接字的層次.可以取三種值:
1)SOL_SOCKET:通用套接字選項.
2)IPPROTO_IP:IP選項.
3)IPPROTO_TCP:TCP選項. 
optname指定控制的方式(選項的名稱),我們下面詳細解釋 


optval獲得或者是設定套接字選項.根據選項名稱的資料型別進行轉換 




選項名稱        說明                  資料型別
========================================================================
            SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST      允許傳送廣播資料            int
SO_DEBUG        允許除錯                int
SO_DONTROUTE      不查詢路由               int
SO_ERROR        獲得套接字錯誤             int
SO_KEEPALIVE      保持連線                int
SO_LINGER        延遲關閉連線              struct linger
SO_OOBINLINE      帶外資料放入正常資料流         int
SO_RCVBUF        接收緩衝區大小             int
SO_SNDBUF        傳送緩衝區大小             int
SO_RCVLOWAT       接收緩衝區下限             int
SO_SNDLOWAT       傳送緩衝區下限             int
SO_RCVTIMEO       接收超時                struct timeval
SO_SNDTIMEO       傳送超時                struct timeval
SO_REUSERADDR      允許重用本地地址和埠         int
SO_TYPE         獲得套接字型別             int
SO_BSDCOMPAT      與BSD系統相容              int
========================================================================
            IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在資料包中包含IP首部          int
IP_OPTINOS       IP首部選項               int
IP_TOS         服務型別
IP_TTL         生存時間                int
========================================================================
            IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大資料段的大小           int
TCP_NODELAY       不使用Nagle演算法             int
========================================================================


返回說明:  
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值          數值
EBADF:sock不是有效的檔案描述詞                                               9
EFAULT:optval指向的記憶體並非有效的程序空間                              14
EINVAL:在呼叫setsockopt()時,optlen無效                                  22
ENOPROTOOPT:指定的協議層不能識別選項                                 92
ENOTSOCK:sock描述的不是套接字                                              88

connect()
 

connect()用於建立與指定socket的連線。

標頭檔案: #include <sys/socket.h>

函式原型: int connect(int s, const struct sockaddr * name, int namelen);

引數:

s:標識一個未連線socket

name:指向要連線套接字的sockaddr結構體的指標

namelen:sockaddr結構體的位元組長度

錯誤程式碼:                                                                                          程式碼值Linux下:EBADF:引數socket未指定一個合法的描述符                                                                 9ENOTSOCK  引數socket未指定一個套接字描述符                                                           88EAFNOSUPPORT  遠端端點指定的地址族不能與這種型別的套接字一起使用                   97EADDRNOTAVAIL:指定的地址不可用                                                                           99EISCONN:套接字已被連線                                                                                            106ETIMEDOUT:(只用於TCP)協議因未成功建立一個連線而超時                                   110ECONNREFUSED:(只用於TCP)連線被遠端機器拒絕                                                 111ENETUNREACH:(只用於TCP)網路當前不可到達                                                       101EADDRINUSE:指定的地址正在使用                                                                               98EINPROGRESS:(只用於TCP)套接字是非阻塞的,且一個連線嘗試將被阻塞               115EALREADY:(只用於TCP)套接字是非阻塞的,且呼叫將等待前一個連線嘗試完成       114