天天看點

[Win32] Windows Sockets 2筆記(2)基本函數

本博文由CSDN部落客zuishikonghuan所作,版權歸zuishiko nghuan所有,轉載請注明出處:http://blog.csdn.net/zuishikonghuan/article/details/48001135

在上一篇中,我說了網絡的基礎知識以及Winsock2的開啟方法,這一篇,我們來說說socket的基本函數

1。建立Socket:socket()函數

SOCKET WSAAPI socket(
  _In_ int af,
  _In_ int type,
  _In_ int protocol
);
           

af:位址族

AF_UNSPEC:未指定的位址族。

AF_INET:Internet 協定版本 4 (IPv4) 系列位址。

AF_IPX:IPX/SPX 的位址族。如果安裝 NWLink IPX/SPX NetBIOS 相容傳輸協定,隻支援此位址族。在 Windows Vista 及更高版本不支援此位址族。

AF_APPLETALK:AppleTalk 的位址族。如果安裝 AppleTalk 協定,隻支援此位址族。在 Windows Vista 及更高版本不支援此位址族。

AF_NETBIOS:NetBIOS 的位址族。如果安裝的 Windows 套接字提供程式 NetBIOS,隻支援此位址族。NetBIOS 的 Windows 套接字提供程式都支援 32 位版本的 Windows。此提供程式是預設安裝的 32 位版本的 Windows 上。NetBIOS 的 Windows 套接字提供程式不支援在 64 位 windows 版本。NetBIOS 的 Windows 套接字提供程式隻支援其中的類型參數設定為 SOCK_DGRAM 的套接字。NetBIOS 的 Windows 套接字提供程式是沒有直接關連的 NetBIOS 的程式設計接口。在 Windows Vista 中,Windows Server 2008,及更高版本上不支援 NetBIOS 的程式設計接口。

AF_INET6:網際網路協定版本 6 (IPv6) 位址家庭。

AF_IRDA:紅外資料協會 (IrDA) 的位址族。如果計算機上有一個紅外端口和安裝驅動程式僅支援此位址族。

AF_BTH:藍牙的位址族。如果計算機有一個藍牙擴充卡和驅動程式安裝在 Windows XP SP2 或更高版本支援此位址族。
           

type:套接字類型(Winsock2版本)

SOCK_STREAM:測序、 可靠、 雙向、 基于連接配接的位元組流提供 OOB 資料傳輸機制的套接字類型。此套接字類型使用傳輸控制協定 (TCP) 網際網路位址族 (AF_INET 或 AF_INET6)。

SOCK_DGRAM:支援無連接配接的、 不可靠的固定 (通常很小) 的最大長度的緩沖區的資料報套接字類型。此套接字類型使用使用者資料報協定 (UDP) 網際網路位址族 (AF_INET 或 AF_INET6)。

SOCK_RAW:提供允許應用程式操縱下的上層協定頭的原始套接字的套接字類型。要操縱 IPv4 标頭,必須在套接字上設定 IP_HDRINCL 套接字選項。要操縱 IPv6 标頭,必須在套接字上設定 IPV6_HDRINCL 套接字選項。

SOCK_RDM:提供可靠的消息資料報套接字類型。這種類型的一個例子是實用通用多點傳播 (PGM) 多點傳播的協定實作在 Windows 中,經常被稱為可靠多點傳播的程式設計。如果安裝可靠的多點傳播協定,隻支援此類型的值。

SOCK_SEQPACKET:提供基于資料報的僞流資料包的套接字類型。
           

protocol:要使用協定

IPPROTO_ICMP:Internet控制封包協定 (ICMP)。af 參數是 AF_UNSPEC、 AF_INET 或 AF_INET6,type為 SOCK_RAW。在 Windows XP 上及更高版本支援此協定值。

IPPROTO_IGMP:Internet組管理協定 (IGMP)。af 參數是 AF_UNSPEC、 AF_INET 或 AF_INET6,type為 SOCK_RAW。在 Windows XP 上及更高版本支援此協定值。

BTHPROTO_RFCOMM:藍牙射頻通信 (藍牙 RFCOMM) 協定。af 參數 AF_BTH,type是 SOCK_STREAM。在 Windows XP SP2 或更高版本支援此協定值。

IPPROTO_TCP:傳輸控制協定 (TCP)。這是一個可能的值,af 參數是 AF_INET 或 AF_INET6,type參數是 SOCK_STREAM。

IPPROTO_UDP:使用者資料報協定 (UDP)。這是一個可能的值,當 af 參數是 AF_INET 或 AF_INET6,type參數是 SOCK_DGRAM。

IPPROTO_ICMPV6:Internet控制封包協定版本 6 (ICMPv6)。這是一個可能的值,af 參數是 AF_UNSPEC、 AF_INET 或 AF_INET6,type為 SOCK_RAW。在 Windows XP 上及更高版本支援此協定值。

IPPROTO_RM:可靠多點傳播 PGM 協定。這是一個可能的值,af 參數是 AF_INET,類型參數是 SOCK_RDM。在 Windows SDK 釋出的 Windows Vista 及更高版本,也被稱為 IPPROTO_PGM。此協定值僅支援安裝了可靠的多點傳播協定的裝置。
           

傳回值:如果沒有出現錯誤,套接字傳回引用新的套接字描述符。否則為傳回值為 INVALID_SOCKET,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。

2。位元組序轉換:

u_short WSAAPI htons(
  _In_ u_short hostshort
);
           

hostshort:16位整數值

傳回值:網絡位元組序整數

u_long WSAAPI htonl(
  _In_ u_long hostlong
);
           

hostshort:32位整數值

傳回值:網絡位元組序整數

unsigned __int64 __inline htonll(
   unsigned __int64 value
);
           

value:64位整數值

傳回值:網絡位元組序整數

u_short WSAAPI ntohs(
  _In_ u_short netshort
);
           

netshort:網絡位元組序16位整數

傳回值:本機位元組序

u_long WSAAPI ntohl(
  _In_ u_long netlong
);
           

netshort:網絡位元組序32位整數

傳回值:本機位元組序

u_long __inline ntohll(
   unsigned __int64 value
);
           

value:網絡位元組序64位整數

傳回值:本機位元組序

3。sockaddr、sockaddr_in結構

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
           

這兩個結構等價,但一般用後者

sin_family:位址族

sin_port:端口号

sin_addr:一個in_addr結構

typedef struct in_addr {
  union {
    struct {
      u_char s_b1,s_b2,s_b3,s_b4;
    } S_un_b;
    struct {
      u_short s_w1,s_w2;
    } S_un_w;
    u_long S_addr;
  } S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
           

S_un_b:IPv4 位址格式設定為四個 u_chars。

S_un_w:IPv4 位址格式設定為兩個 u_shorts。

S_addr:IPv4 位址的格式為 u_long。

而如果是IPv6要用這個結構:

struct sockaddr_in6 {
        short   sin6_family;
        u_short sin6_port;
        u_long  sin6_flowinfo;
        struct  in6_addr sin6_addr;
        u_long  sin6_scope_id;
};

typedef struct sockaddr_in6 SOCKADDR_IN6;
typedef struct sockaddr_in6 *PSOCKADDR_IN6;
typedef struct sockaddr_in6 FAR *LPSOCKADDR_IN6;


struct sockaddr_in6_old {
        short   sin6_family;        
        u_short sin6_port;          
        u_long  sin6_flowinfo;      
        struct  in6_addr sin6_addr;  
};
           

4。inet_addr函數

unsigned long inet_addr(
  _In_ const char *cp
);
           

cp:使用”.“分割的十進制IPv4位址。

傳回值:如果沒有出現錯誤,則 inet_addr 函數傳回二進制表示的網際網路位址的無符号長整型值。

5。inet_ntoa函數

char* FAR inet_ntoa(
  _In_ struct   in_addr in
);
           

in:in_addr 結構,它表示網際網路主機位址。

傳回值:inet_ntoa 如果沒有出現錯誤,傳回在靜态緩沖區中的使用”.“分割的十進制IPv4位址。否則傳回 NULL。

6。bind函數

int bind(
  _In_ SOCKET                s,
  _In_ const struct sockaddr *name,
  _In_ int                   namelen
);
           

s:套接字描述符

name:sockaddr、sockaddr_in結構的指針,表示要将socket綁定到的位址。

namelen:長度

傳回值:如果沒有出現錯誤,将綁定并傳回零。否則傳回 SOCKET_ERROR,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。

7。listen函數

int listen(
  _In_ SOCKET s,
  _In_ int    backlog
);
           

s:套接字描述符

backlog:挂起連接配接隊列的最大長度。如果設定為SOMAXCONN,基礎服務提供程式負責套接字s将設定積壓為合理的最大值。

傳回值:如果沒有出現錯誤,傳回零。否則為傳回值為 SOCKET_ERROR,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。

8。accept函數

SOCKET accept(
  _In_    SOCKET          s,
  _Out_   struct sockaddr *addr,
  _Inout_ int             *addrlen
);
           

s:套接字描述符

addr:指向一個緩沖區,接收連接配接實體的位址,稱為通信層。位址參數的确切格式由成立時的接近于結構從套接字建立的位址族決定。

addrlen:接收長度

傳回值:如果沒有出現錯誤,接受傳回值的類型是一個新的套接字的描述符的套接字。此傳回值是用于作出實際連接配接的套接字的句柄。否則為傳回值為 INVALID_SOCKET,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。

9。send函數

int send(
  _In_       SOCKET s,
  _In_ const char   *buf,
  _In_       int    len,
  _In_       int    flags
);
           

s:套接字描述符

buf:緩沖區,要發送的資料

len:資料長度

flags:标志,一般為0,也可以是:MSG_DONTROUTE:指定的資料應該不會受到路由。MSG_OOB:發送 OOB 資料。

10。recv函數

int recv(
  _In_  SOCKET s,
  _Out_ char   *buf,
  _In_  int    len,
  _In_  int    flags
);
           

s:套接字描述符

buf:緩沖區,用于存儲要接收的資料

len:buf緩沖區長度

flags:标志,一般為0

傳回值:如果沒有出現錯誤,recv 傳回接收的位元組數和 buf 參數指向的緩沖區将包含此收到的資料。如果連接配接已正常關閉,則傳回值為零。否則傳回值為 SOCKET_ERROR,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。

11。connect函數

int connect(
  _In_ SOCKET                s,
  _In_ const struct sockaddr *name,
  _In_ int                   namelen
);
           

s:套接字描述符

name:sockaddr、sockaddr_in結構的指針,表示要連接配接的位址。

namelen:長度

傳回值:如果沒有出現錯誤,連接配接傳回零。否則為它傳回 SOCKET_ERROR,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。

12。select函數

int select(
  _In_    int                  nfds,
  _Inout_ fd_set               *readfds,
  _Inout_ fd_set               *writefds,
  _Inout_ fd_set               *exceptfds,
  _In_    const struct timeval *timeout
);
           

nfds:将忽略。Nfds 參數是隻是為了與伯克利套接字的相容性。

readfds:可選的指針,指向一組等待可讀性檢查的套接口。

typedef struct fd_set {
  u_int  fd_count;
  SOCKET fd_array[FD_SETSIZE];
} fd_set;
           

fd_count:集合中的套接字的數目。

fd_array:套接字集合的數組

writefds:可選的指針,指向一組等待可寫性檢查的套接口。

exceptfds:可選的指針,指向一組等待錯誤檢查的套接口。

timeout:選擇等待的最長時間提供的 TIMEVAL 結構形式。

typedef struct timeval {
  long tv_sec;
  long tv_usec;
} timeval;
           

tv_sec:時間間隔,以秒為機關。

tv_usec:以微秒為機關的時間間隔。

傳回值:傳回處于就緒狀态并且已經包含在fd_set結構中的描述字總數;如果逾時傳回0;否則的話,傳回SOCKET_ERROR,可通過WSAGetLastError擷取錯誤代碼。

13。closesocket函數

int closesocket(
  _In_ SOCKET s
);
           

s:套接字描述符

傳回值:如果沒有出現錯誤,接字傳回零。否則為傳回值為 SOCKET_ERROR,并且可以通過調用 WSAGetLastError 檢索特定的錯誤代碼。



繼續閱讀