winsock学习笔记(二)

PS:这几篇学习笔记都是在windows dev center上学习的东西,大部分是翻译。传送门:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738545(v=vs.85).aspx#winsock.advanced_winsock_samples


这一节主要讲一个client socket使用的过程,步骤在上一篇中有提到过。温习一下:

Initialize Winsock.(初始化winsock)
Create a socket.(创建套接字)
Connect to the server.(连接至服务端)
Send and receive data.(发送和接受数据或消息)
Disconnect.(断开连接)

1、 create a client socket
     1.1、 声明一个addinfo结构类型的暗示变量(或者说约束条件)并初始化:

C++:
struct
addrinfo *result = NULL,
                *ptr = NULL,
                hints;
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

其中:
1) ZeroMemory函数用于对指定长度(第二个参数)的指定区域(第一个参数)进行清零,即全部初始化为0。
2) 由于没指定是ipv4还是ipv6,因此ai_family设置为AF_UNSPEC,可以返回两种类型的地址的任意一种。(AF_INET for ipv4,AF_INET6 for ipv6)
3) 使用的是TCP传输,因此ai_socktype设置为流式传播SOCK_STREAM,ai_protocol设置为IPPROTO_TCP。

     1.2、 通过getaddrinfo函数获取服务端的地址信息:

C++:
#define DEFAULT_PORT "27015"
// Resolve the server address and port
iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
if
(iResult != 0) {
    printf("getaddrinfo failed: %d\n", iResult);
    WSACleanup();
return 1;
}

其中:
1)第一个参数为服务端地址,第二个参数为端口号;
2)第三个参数就是上面介绍的暗示变量,或者说约束条件。通过对这个结构实例的设置可以对返回结构进行过滤。例如,如果将其ai_socktype设置为0,ai_protocol设置为0,则运行getaddrinfo自后返回的result是一条有三个节点的链表,三个节点的ai_socktype分别是SOCK_DGRAM,SOCK_STREAM,SOCK_SEQPACKET。因此对hints设置后就可以过滤得到自己想要的网络地址类型。
3)第四个参数就是保存getaddrinfo返回的服务器地址信息。
4)返回值iResult为0表示成功,非0表示失败

     1.3、 创建一个用于服务器通讯的socket:
C++:
SOCKET ConnectSocket = INVALID_SOCKET;
// Attempt to connect to the first address returned by
// the call to getaddrinfo
ptr=result;

// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
    ptr->ai_protocol);
 
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值