📄 slpd_socket.c
字号:
} /* free the actual socket structure */ xfree(sock);}/*==========================================================================*/SLPDSocket* SLPDSocketCreateDatagram(struct in_addr* peeraddr, int type)/* myaddr - (IN) the address of the interface to join mcast on */ /* *//* peeraddr - (IN) the address of the peer to connect to *//* *//* type (IN) DATAGRAM_UNICAST, DATAGRAM_MULTICAST, DATAGRAM_BROADCAST *//* *//* Returns: A datagram socket SLPDSocket->state will be set to *//* DATAGRAM_UNICAST, DATAGRAM_MULTICAST, or DATAGRAM_BROADCAST *//*==========================================================================*/{ SLPDSocket* sock; sock = SLPDSocketAlloc(); if(sock) { /* SLP_MAX_DATAGRAM_SIZE is as big as a datagram SLP */ /* can be. */ sock->recvbuf = SLPBufferAlloc(SLP_MAX_DATAGRAM_SIZE); sock->sendbuf = SLPBufferAlloc(SLP_MAX_DATAGRAM_SIZE); if(sock->recvbuf && sock->sendbuf) { sock->fd = socket(PF_INET, SOCK_DGRAM, 0); if(sock->fd >=0) { switch(type) { case DATAGRAM_BROADCAST: EnableBroadcast(sock->fd); break; case DATAGRAM_MULTICAST: SetMulticastTTL(sock->fd,G_SlpdProperty.multicastTTL); break; default: break; } sock->peeraddr.sin_family = AF_INET; sock->peeraddr.sin_addr = *peeraddr; sock->peeraddr.sin_port = htons(SLP_RESERVED_PORT); sock->state = type; } else { SLPDSocketFree(sock); sock = 0; } } else { SLPDSocketFree(sock); sock = 0; } } return sock;} /*==========================================================================*/SLPDSocket* SLPDSocketCreateBoundDatagram(struct in_addr* myaddr, struct in_addr* peeraddr, int type)/* myaddr - (IN) the address of the interface to join mcast on */ /* *//* peeraddr - (IN) the address of the peer to connect to *//* *//* type (IN) DATAGRAM_UNICAST, DATAGRAM_MULTICAST, DATAGRAM_BROADCAST *//* *//* Returns: A datagram socket SLPDSocket->state will be set to *//* DATAGRAM_UNICAST, DATAGRAM_MULTICAST, or DATAGRAM_BROADCAST *//*==========================================================================*/{ SLPDSocket* sock; struct in_addr* bindaddr; /*------------------------------------------*/ /* Adjust for multicast binding differences */ /*------------------------------------------*/#ifdef LINUX bindaddr = peeraddr; #else if(type == DATAGRAM_MULTICAST) bindaddr = NULL; /* must bind to INADDR_ANY for multicast */ else bindaddr = peeraddr; #endif /*------------------------*/ /* Create and bind socket */ /*------------------------*/ sock = SLPDSocketAlloc(); if(sock) { sock->recvbuf = SLPBufferAlloc(SLP_MAX_DATAGRAM_SIZE); sock->sendbuf = SLPBufferAlloc(SLP_MAX_DATAGRAM_SIZE); sock->fd = socket(PF_INET, SOCK_DGRAM, 0); if(sock->fd >=0) { if(myaddr != NULL) sock->ifaddr.sin_addr = *myaddr; if(BindSocketToInetAddr(sock->fd, bindaddr) == 0) { if(peeraddr != NULL) { sock->peeraddr.sin_addr = *peeraddr; } switch(type) { case DATAGRAM_MULTICAST: if(JoinSLPMulticastGroup(sock->fd, peeraddr, myaddr) == 0) { sock->state = DATAGRAM_MULTICAST; goto SUCCESS; } break; case DATAGRAM_BROADCAST: if(EnableBroadcast(sock->fd) == 0) { sock->state = DATAGRAM_BROADCAST; goto SUCCESS; } break; case DATAGRAM_UNICAST: default: sock->state = DATAGRAM_UNICAST; goto SUCCESS; break; } } } } if(sock) { SLPDSocketFree(sock); } sock = 0; SUCCESS: return sock; }/*==========================================================================*/SLPDSocket* SLPDSocketCreateListen(struct in_addr* peeraddr)/* *//* peeraddr - (IN) the address of the peer to connect to *//* *//* type (IN) DATAGRAM_UNICAST, DATAGRAM_MULTICAST, DATAGRAM_BROADCAST *//* *//* Returns: A listening socket. SLPDSocket->state will be set to *//* SOCKET_LISTEN. Returns NULL on error *//*==========================================================================*/{ int fdflags; SLPDSocket* sock; sock = SLPDSocketAlloc(); if(sock) { sock->fd = socket(PF_INET, SOCK_STREAM, 0); if(sock->fd >= 0) { if(peeraddr != NULL) sock->ifaddr.sin_addr = *peeraddr; if(BindSocketToInetAddr(sock->fd, peeraddr) >= 0) { if(listen(sock->fd,5) == 0) { /* Set socket to non-blocking so subsequent calls to */ /* accept will *never* block */#ifdef _WIN32 fdflags = 1; ioctlsocket(sock->fd, FIONBIO, &fdflags);#else fdflags = fcntl(sock->fd, F_GETFL, 0); fcntl(sock->fd,F_SETFL, fdflags | O_NONBLOCK);#endif sock->state = SOCKET_LISTEN; return sock; } } } } if(sock) { SLPDSocketFree(sock); } return 0;}/*==========================================================================*/SLPDSocket* SLPDSocketCreateConnected(struct in_addr* addr)/* *//* addr - (IN) the address of the peer to connect to *//* *//* Returns: A connected socket or a socket in the process of being connected*//* if the socket was connected the SLPDSocket->state will be set *//* to writable. If the connect would block, SLPDSocket->state will*//* be set to connect. Return NULL on error *//*==========================================================================*/{#ifdef _WIN32 char lowat; u_long fdflags;#else int lowat; int fdflags;#endif SLPDSocket* sock = 0; sock = SLPDSocketAlloc(); if(sock == 0) { goto FAILURE; } /* create the stream socket */ sock->fd = socket(PF_INET,SOCK_STREAM,0); if(sock->fd < 0) { goto FAILURE; } /* set the socket to non-blocking */#ifdef _WIN32 fdflags = 1; ioctlsocket(sock->fd, FIONBIO, &fdflags);#else fdflags = fcntl(sock->fd, F_GETFL, 0); fcntl(sock->fd,F_SETFL, fdflags | O_NONBLOCK);#endif /* zero then set peeraddr to connect to */ sock->peeraddr.sin_family = AF_INET; sock->peeraddr.sin_port = htons(SLP_RESERVED_PORT); sock->peeraddr.sin_addr = *addr; /* set the receive and send buffer low water mark to 18 bytes (the length of the smallest slpv2 message) */ lowat = 18; setsockopt(sock->fd,SOL_SOCKET,SO_RCVLOWAT,&lowat,sizeof(lowat)); setsockopt(sock->fd,SOL_SOCKET,SO_SNDLOWAT,&lowat,sizeof(lowat)); /* non-blocking connect */ if(connect(sock->fd, (struct sockaddr *) &(sock->peeraddr), sizeof(sock->peeraddr)) == 0) { /* Connection occured immediately */ sock->state = STREAM_CONNECT_IDLE; } else {#ifdef _WIN32 if(WSAEWOULDBLOCK == WSAGetLastError())#else if(errno == EINPROGRESS)#endif { /* Connect would have blocked */ sock->state = STREAM_CONNECT_BLOCK; } else { goto FAILURE; } } return sock; /* cleanup on failure */ FAILURE: if(sock) { SLPDSocketFree(sock); sock = 0; } return sock;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -