HawkNL 源码剖析

 1 void sock_Close(NLsocket socket)
2 {
3 nl_socket_t *sock = nlSockets[socket];
4 struct ip_mreq mreq;
5
6 if(sock->type == NL_UDP_MULTICAST)
7 {
8 /* leave the multicast group */
9 mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)&sock->addressout)->sin_addr.s_addr;
10 mreq.imr_interface.s_addr = bindaddress;
11
12 (void)setsockopt((SOCKET)sock->realsocket, IPPROTO_IP, IP_DROP_MEMBERSHIP,
13 (char *)&mreq, (int)sizeof(mreq));
14 }
15 if(sock->type == NL_RELIABLE_PACKETS)
16 {
17 /* check for unsent data */
18 if(sock->sendlen > 0)
19 {
20 int tries = 200;
21
22 /* 200 * 50 ms = up to a 10 second delay to allow data to be sent */
23 while(tries-- > 0 && sock->sendlen > 0)
24 {
25 htThreadSleep(50);
26 }
27 }
28 sock_DeleteSocket(socket);
29 }
30 if((sock->type == NL_RELIABLE_PACKETS || sock->type == NL_RELIABLE) && sock->listen == NL_FALSE)
31 {
32 struct linger l = {1, 10};//延迟10s
33
34 (void)setsockopt((SOCKET)sock->realsocket, SOL_SOCKET, SO_LINGER, (const char *)&l, (int)sizeof(l));
35 (void)shutdown((SOCKET)sock->realsocket, SD_RECEIVE);
36 }
37 else
38 {
39 (void)shutdown((SOCKET)sock->realsocket, SD_BOTH);
40 }
41 (void)closesocket((SOCKET)sock->realsocket);
42 }

转载于:https://www.cnblogs.com/kanego/archive/2012/04/07/2436408.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值