你的位置:首页 > 操作系统

[操作系统]初始Winsock编程


1、套接字的创建和关闭

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

1 SOCKET socket(2 int af,  //用来指定套接字使用的地址格式,Winsock中只能使用AF_INET3 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  //指定了调用方式,一般设为06 );

1 int  recv(SOCKET s,char FAR* buf,int len,int flags);

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

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




江苏旅游报价价格江苏旅游景点推荐江苏旅游团报价江苏旅游团购优惠江苏旅游线路报价广东云髻山有红叶吗?新丰云髻山满山红叶是真的吗? 海心沙灯光节什么时候开始?有什么好看的? 广东云髻山有停车场吗?云髻山停车怎么收费? 去敦煌怎么省钱呢?敦煌省钱攻略 南宁海底世界中秋节有什么好玩的?中秋节广西南宁海底世界晚会项目? 2015中秋节南宁海底世界活动介绍?广西南宁海底世界中秋节优惠吗? 南宁海底世界中秋节晚会时间?中秋节广西南宁海底世界节目演几天? 桂林好玩的旅游活动有哪些 统景皇帝漂流注意事项?重庆统景皇帝漂流需要注意什么? 统景皇帝漂好不好玩?重庆统景皇帝漂流攻略? 九江桃花源漂流门票2015-5-7月庐山桃花源漂流门票价格? 韶关乳源云门峡漂流团购优惠吗?云门峡漂流怎么预订? 住在阳朔西街附近,会不会很吵? 11、12月份去海南,还需要涂防晒霜吗? 鼓浪屿附近有七天连锁吗?我有卡 圣诞给不同星座的人送什么礼物好? 553-0006-813 Datasheet 553-0006-813 Datasheet 553-0006-813F Datasheet 553-0006-813F Datasheet 553-0006-814 Datasheet 553-0006-814 Datasheet 长春到香港旅游团价格 长春到香港旅游团价格 长春到香港旅游团价格 济南港澳游价格 济南港澳游价格 济南港澳游价格 包头跟团港澳五日游价格 包头跟团港澳五日游价格 包头跟团港澳五日游价格