socket 编程
winsocket2 函数库
语法
SOCKET WSAAPI socket(
int af,
int type,
int protocol
);
参数
af
地址簇规范
当前支持的值是AF_INET或AF_INET6,它们是IPv4和IPv6的Internet地址系列格式。(The values currently supported are AF_INET or AF_INET6, which are the Internet address family formats for IPv4 and IPv6.
),
常用的地址簇:
AF | Meaning |
---|---|
AF_UNSPEC 0 |
The address family is unspecified. |
AF_INET 2 |
The Internet Protocol version 4 (IPv4) address family. |
AF_INET6 23 | The Internet Protocol version 6 (IPv6) address family. |
type
新套接字的类型规范。
windows socket 2支持的type
参数(部分)
Type | Meaning |
---|---|
SOCK_STREAM 1 |
一种套接字类型,提供带有OOB数据传输机制的顺序,可靠,双向,基于连接的字节流。 此套接字类型使用传输控制协议(TCP)作为Internet地址系列(AF_INET或AF_INET6)。 |
SOCK_DGRAM 2 |
一种支持数据报的套接字类型,它是固定(通常很小)最大长度的无连接,不可靠的缓冲区。 此套接字类型使用用户数据报协议(UDP)作为Internet地址系列(AF_INET或AF_INET6)。 |
SOCK_RAW 3 |
一种套接字类型,提供允许应用程序操作下一个上层协议头的原始套接字。 要操作IPv4标头,必须在套接字上设置IP_HDRINCL套接字选项。 要操作IPv6标头,必须在套接字上设置IPV6_HDRINCL套接字选项。 |
protocol
协议
如果指定值0,则调用者不希望指定协议,服务提供者将选择要使用的协议。
common values for the protocol
返回值(Return Value)
如果没有错误发生,socket返回一个新套接字的描述符;如果发生错误,将返回INVALID_SOCKET
,通过调用 WSAGetLastError
,可以得到具体的错误代码。
demo实例
#pragma comment(lib,"Ws2_32.lib") //link Ws2_32.lib
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h> // Needed for _wtoi
int main(){
WSADATA wsaData = {0};
SOCKET sock = INVALID_SOCKET;
int iFamily = AF_UNSPEC;
int iType = 0;
int iProtocol = 0;
iFamily = _wtoi(argv[1]);
iType = _wtoi(argv[2]);
iProtocol = _wtoi(argv[3]);
int iReturn=0;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed: %d\n", iResult);
return 1;
}
socket=socket(iFamily,iType,iProtocol);
if (sock == INVALID_SOCKET)
wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
else {