Winsock API:socket

来自:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx

The socket function creates a socket that is bound to a specific transport service provider.

Syntax


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

Parameters

af [in]

The address family specification. Possible values for the address family are defined in theWinsock2.h header file.

The values currently supported are AF_INET or AF_INET6, which are the Internet address family formats for IPv4 and IPv6. Other options for address family (AF_NETBIOS for use with NetBIOS, for example) are supported if a Windows Sockets service provider for the address family is installed. Note that the values for the AF_ address family and PF_ protocol family constants  are identical (for example,AF_INET and PF_INET), so either constant can be used.

The table below lists common values for address family although many other values are possible.

 

 

AfMeaning
AF_UNSPEC 0

The address family is unspecified.

AF_INET 2

The Internet Protocol version 4 (IPv4) address family.

AF_IPX 6

The IPX/SPX address family. This address family is only supported if the NWLink IPX/SPX NetBIOS Compatible Transport protocol is installed.

This address family is not supported on Windows Vista and later.

AF_APPLETALK 16

The AppleTalk address family. This address family is only supported if the AppleTalk protocol is installed.

This address family is not supported on Windows Vista and later.

AF_NETBIOS 17

The NetBIOS address family. This address family is only supported if the Windows Sockets provider for NetBIOS is installed.

The Windows Sockets provider for NetBIOS  is supported on 32-bit versions of Windows. This provider is installed by default on 32-bit versions of Windows.

The Windows Sockets provider for NetBIOS is not supported on 64-bit versions of windows including Windows 7,  Windows Server 2008, Windows Vista, Windows Server 2003, or Windows XP. 

The Windows Sockets provider for NetBIOS  only supports sockets where the type parameter is set to SOCK_DGRAM.

The Windows Sockets provider for NetBIOS  is not directly related to the NetBIOS programming interface. The NetBIOS programming interface is not supported on Windows Vista, Windows Server 2008, and later.

AF_INET6 23

The Internet Protocol version 6 (IPv6) address family.

AF_IRDA 26

The Infrared Data Association (IrDA) address family.

This address family is only supported if the computer has an infrared port and driver installed.

AF_BTH 32

The Bluetooth address family.

This address family is supported on Windows XP with SP2 or later if the computer has a Bluetooth adapter and driver installed.

  type [in]

The type specification for the new socket.  Possible values for the socket type are defined in theWinsock2.h header file.

The following table lists the possible values for the type parameter supported for Windows Sockets 2:

 

TypeMeaning
SOCK_STREAM 1

A socket type that provides sequenced, reliable, two-way, connection-based byte streams with an OOB data transmission mechanism. This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6).

SOCK_DGRAM 2

A socket type that supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length. This socket type uses the User Datagram Protocol (UDP) for the Internet address family (AF_INET or AF_INET6).

SOCK_RAW 3

A socket type that provides a raw socket that allows an application to manipulate the next upper-layer protocol header. To manipulate the IPv4 header, theIP_HDRINCL socket option must be set on the socket.  To manipulate the IPv6 header, theIPV6_HDRINCL socket option must be set on the socket. 

SOCK_RDM 4

A socket type that provides a reliable message datagram. An example of this type is the Pragmatic General Multicast (PGM) multicast protocol implementation in Windows, often referred to asreliable multicast programming.

This type value is only supported if the Reliable Multicast Protocol is installed.

SOCK_SEQPACKET 5

A socket type that provides a pseudo-stream packet based on datagrams.

 

protocol [in]

The protocol to be used. The possible options for the protocol parameter are specific to the address family and socket type specified. Possible values for theprotocol are defined in the  Winsock2.h and Wsrm.h header files.

If a value of  0 is specified, the caller does not              wish to specify a protocol and the service provider will choose theprotocol to use.

When the af parameter is AF_INET or AF_INET6 and the type isSOCK_RAW, the value specified for the protocol is set in the protocol field of the IPv6 or IPv4 packet header.

The table below lists common values for the protocol although many other values are possible.

 

protocolMeaning
IPPROTO_ICMP 1

The Internet Control Message Protocol (ICMP). This is a possible value when theaf parameter is AF_UNSPEC, AF_INET, orAF_INET6 and the type parameter is SOCK_RAW or unspecified.

This protocol value is supported on Windows XP and later.

IPPROTO_IGMP 2

The Internet Group Management Protocol (IGMP). This is a possible value when theaf parameter is AF_UNSPEC, AF_INET, orAF_INET6 and the type parameter is SOCK_RAW or unspecified.

This protocol value is supported on Windows XP and later.

BTHPROTO_RFCOMM 3

The Bluetooth Radio Frequency Communications (Bluetooth RFCOMM) protocol. This is a possible value when theaf parameter is AF_BTH and the type parameter isSOCK_STREAM.

This protocol value is supported on Windows XP with SP2 or later.

IPPROTO_TCP 6

The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and thetype parameter is SOCK_STREAM.

IPPROTO_UDP 17

The User Datagram Protocol (UDP). This is a possible value when the af parameter isAF_INET or AF_INET6 and the type parameter isSOCK_DGRAM.

IPPROTO_ICMPV6 58

The Internet Control Message Protocol  Version 6 (ICMPv6). This is a possible value when theaf parameter is AF_UNSPEC, AF_INET, orAF_INET6  and the type parameter is SOCK_RAW or unspecified.

This protocol value is supported on Windows XP and later.

IPPROTO_RM 113

The PGM protocol for reliable multicast. This is a possible value when the af parameter is AF_INET and the type parameter is SOCK_RDM. On the Windows SDK released for Windows Vista and later,  this protocol is also calledIPPROTO_PGM.

This protocol value is only supported if the Reliable Multicast Protocol is installed.

 

Return value

If no error occurs, socket returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by callingWSAGetLastError.

Remarks

The socket function causes a socket descriptor and any related resources to be allocated and bound to a specific transport-service provider. Winsock will utilize the first available service provider that supports the requested combination of address family, socket type and protocol parameters. The socket that is created will have the overlapped attribute as a default. For Windows, the Microsoft-specific socket option, SO_OPENTYPE, defined in Mswsock.h can affect this default. See Microsoft-specific documentation for a detailed description of SO_OPENTYPE.

Example Code

The following example demonstrates the use of the socket function to create a socket that is bound to a specific transport service provider..

 

#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;

    // Validate the parameters
    if (argc != 4) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
        wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    sock = socket(iFamily, iType, iProtocol);
    if (sock == INVALID_SOCKET) 
        wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"socket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket failed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }

    WSACleanup();

    return 0;
}


 

 

生词注释:

  retrieve   -  简明英汉词典
D.J.[riˈtri:v]
vt.
1.  寻回, 找回
2.  恢复, 挽回
3.  检索(储存的信息)
4.  使某事物恢复旺盛状态
vt. & vi. (指经过训练的狗)找到并衔回(被打死或打伤的鸟等)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值