1、套接字的创建和关闭

  使用套接字之前,必须使用socket函数创建一个套接字,此函数调用成功将返回一个套接字句柄。

1 SOCKET socket(
2 int af, //用来指定套接字使用的地址格式,Winsock中只能使用AF_INET
3 int type, //用来指定套接字的类型
4 int protocol //配合type参数使用,用来指定使用的协议类型。可以是IPPROTO_TCP等
5 );

  type参数指定套接字的类型。套接字有流套接字、数据报套接字和原始套接字

  SOCK_STREAM  流套接字,使用TCP提供有连接的可靠的传输。

  SOCK_DGRAM   数据报套接字,使用UDP提供无连接的不可靠的传输。

  SOCK_RAW          原始套接字,由程序自行处理数据报以及协议首部。

  当type参数明确为SOCK_STREAM和SOCK_DGRAM时,protocol参数的值可为0。

  函数调用失败时返回INVALID_SOCKET(-1),可通过WSAGetLastError取得错误代码。

  当不使用创建的套接字时,应调用closesocket函数来关闭套接字。没有发生错误则返回0,否则返回SOCKET_ERROR。

1 int closesocket(SOCKET s);   //函数唯一的参数就是要关闭的套接字

2、绑定套接字到指定的IP地址和端口号:bind函数

1 int  bind(
2 SOCKET s, //套接字句柄
3 const struct sockaddr* name, //要关联的本机地址
4 int namelen //地址的长度
5 )

  绑定函数安排一个本地名称到未命名的socket而建立此socket的本地关联。本地名称包括三部分:主机地址、协议号(TCP和UDP)和端口号。

1 sockaddr_in sin;
2 sin.sin_family = AF_INET; //地址协议家族
3 sin.sin_port = htons(4567); //端口
4 sin.sin_addr.S_un.S_addr = INADDR_ANY; //监听的IP地址
5 if(::bind(sListen,(LPSOCKET)&sin,sizeof(sin)) == SOCKET_ERROR)
6 {
7 printf("Failed bind()\n");
8 return 0;
9 }

3、设置套接字进入监听状态:listen函数

1 int listen(
2 SOCKET s, //套接字句柄
3 int backlog //监听队列中允许保持的尚未处理的最大连接数量
4 );

  listen仅应用在支持连接的套接字上。函数执行成功后,套接字s进入被动模式,到来的连接会被通知要排队等候接受处理。

  在同一时间处理多个连接请求的服务器通常使用listen函数,如果一个连接请求到达,且排队已满,客户端将收到WSAECONNREFUSED错误。

4、接受连接请求:accept函数

1 SOCKET accept(
2 SOCKET s, //套接字句柄
3 struct sockaddr* addr, //一个指向sockaddr_in结构的指针,用于取得对方的地址信息
4 int* addrlen //一个指向地址长度的指针
5 );

  该函数默认工作在阻塞模式下。函数在s上取出未处理连接中的第一个连接,为这个连接创建新的套接字,返回它的句柄。新创建的套接字是处理实际连接的套接字,与s有相同的属性。

  addrlen参数用于指定addr所指空间的大小,也用于返回地址的实际长度。如果为NULL,则没有关于远程地址的信息返回。

  客户端程序在创建套接字之后,需要使用connect函数请求与服务器进行连接。

1 int    connect(
2 SOCKET s, //套接字句柄
3 const struc sockaddr FAR* name, //一个指向sockaddr_in结构的指针,包含了要连接的服务器的信息
4 int namelen //sockaddr_in结构的指针
5 );

  第一个参数所说的套接字句柄指的是客户端的套接字,而另外两个参数都是用来寻址远程套接字,即服务器端的监听套接字。

5、收发数据

  对于流套接字,一般使用send和recv函数来收发数据。

1 int    send(
2 SOCKET s, //套接字句柄
3 const char FAR* buf, //要发送数据的缓冲区地址
4 int len, //缓冲区长度
5 int flags //指定了调用方式,一般设为0
6 );
1 int    recv(SOCKET s,char FAR* buf,int len,int flags);

  最后解释一下什么是套接字及其作用:

  套接字是支持TCP/IP网络通信的基本操作单元,可以看做不同主机之间的进程进行双向通信的端点。简单说就是通信双方的一种约定,用套接字中的相关函数可以完成通信过程。

初始Winsock编程的更多相关文章

  1. Winsock编程基础介绍 .

    相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...

  2. NetBIOS与Winsock编程接口

    最近在看网络编程方面的书,由于不是通信专业出身的,以前理解的网络体系感觉就是tcp/ip,最近工作上接触到了一些光环网等乱七八糟的东西,有些基本的LC.SC连接器都不认识.花时间看了下计算机网络体系结 ...

  3. Winsock 编程流程

    近期看了<Window程序设计>感觉在网络方面讲的不错,讲的非常通俗易懂.与大家一同交流 转载请注明出处:http://blog.csdn.net/u010484477谢谢^_^ 使用 W ...

  4. winsock编程IOCP模型实现代码

    winsock编程IOCP模型实现代码 话不多说,上代码.借鉴<windows核心编程>部分源码和CSDN小猪部分代码. stdafx.h依赖头文件: #include <iostr ...

  5. winsock编程WSAEventSelect模型

    winsock编程WSAEventSelect模型 WSAEventSelect模型和WSAAsyncSelec模型类似,都是用调用WSAXXXXXSelec函数将socket和事件关联并注册到系统, ...

  6. winsock编程WSAAsyncSelect模型

    winsock编程WSAAsyncSelect模型 WSAAsyncSelect模型也称异步选择模型,其核心函数是WSAAsyncSelect.它可以用来在一个socket上接收以windows消息为 ...

  7. winsock编程select模型

    winsock编程select模型 网络服务端连接数量过多时,为每一个连接申请一个线程会让机器性能急剧下降(大多说是因为线程在用户态和内核态之间切换会占用大量的CPU时间片).为了解决多线程带来的性能 ...

  8. Delphi下的WinSock编程

    一.定址        要通过Winsock建立通信,必须了解如何利用指定的协议为工作站定址.Winsock 2引入了几个新的.与协议无关的函数,它们可和任何一个地址家族一起使用:但是大多数情况下,各 ...

  9. winsock 编程(简单客户&服务端通信实现)

    winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if  Server receive the message, ...

随机推荐

  1. 视音频数据处理入门:UDP-RTP协议解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  2. ElastAlert规则

    elastalert 是一款基于elasticsearch的开源告警产品(官方说明文档).相信许多人都会使用ELK做日志收集系统,但是产生一个基于日志的“优秀”的安全告警确是一个难题.告警规则难编写, ...

  3. webapi框架搭建-安全机制(三)-简单的基于角色的权限控制

    webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...

  4. IOC轻量级框架之Unity

    任何事物的出现,总有它独特的原因,Unity也是如此,在Unity产生之前,我们是这么做的 我们需要在一个类A中引用另一个类B的时候,总是将类B的实例放置到类A的构造函数中,以便在初始化类A的时候,得 ...

  5. 手把手教你在.NET中创建Web服务

    最近发现在.NET平台下使用Web服务还是很简单的.下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码如 ...

  6. [php]php时间格式化

    1.将毫秒转化为时间格式 date("Y-m-d H:i:s",$millsec);

  7. PartyPlay发布版

    发布版本在beta版本的基础之上修改了pose王中的显示函数部分,使其可以正常的多次显示不同图片,不会出现卡在一张图片的问题上. 因此总的发布版本内容: 1.谁是卧底: 点击进入谁是卧底,进入游戏前的 ...

  8. 20155330 2016-2017-2 《Java程序设计》第五周学习总结

    20155330 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 学习目标 理解异常架构 掌握try...catch...finally处理异常的方法 会用t ...

  9. Concat层解析

    Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9 ...

  10. 【leetcode 简单】 第五十六题 快乐数

    编写一个算法来判断一个数是不是“快乐数”. 一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1.如 ...