⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slp_xcast.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//* Project:     OpenSLP - OpenSource implementation of Service Location    *//*              Protocol                                                   *//*                                                                         *//* File:        slp_xcast.c                                                *//*                                                                         *//* Abstract:    Functions used to multicast and broadcast SLP messages     *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//*     Please submit patches to http://www.openslp.org                     *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//* Copyright (C) 2000 Caldera Systems, Inc                                 *//* All rights reserved.                                                    *//*                                                                         *//* Redistribution and use in source and binary forms, with or without      *//* modification, are permitted provided that the following conditions are  *//* met:                                                                    *//*                                                                         *//*      Redistributions of source code must retain the above copyright     *//*      notice, this list of conditions and the following disclaimer.      *//*                                                                         *//*      Redistributions in binary form must reproduce the above copyright  *//*      notice, this list of conditions and the following disclaimer in    *//*      the documentation and/or other materials provided with the         *//*      distribution.                                                      *//*                                                                         *//*      Neither the name of Caldera Systems nor the names of its           *//*      contributors may be used to endorse or promote products derived    *//*      from this software without specific prior written permission.      *//*                                                                         *//* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS     *//* `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT      *//* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR   *//* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CALDERA      *//* SYSTEMS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *//* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT        *//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  *//* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON       *//* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *//* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   *//* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.    *//*                                                                         *//***************************************************************************/#ifdef _WIN32#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <io.h>#include <errno.h>#define ETIMEDOUT 110#define ENOTCONN  107#else#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/socket.h>#include <sys/time.h>#include <netinet/in.h>#include <arpa/inet.h> #include <netdb.h> #include <fcntl.h> #include <errno.h>#endif#ifndef UNICAST_NOT_SUPPORTED#include "../libslp/slp.h"#endif#include "slp_xcast.h"#include "slp_message.h"#include "slp_property.h"/*========================================================================*/int SLPBroadcastSend(const SLPIfaceInfo* ifaceinfo,                      SLPBuffer msg,                     SLPXcastSockets* socks)/* Description: *    Broadcast a message. * * Parameters: *    ifaceinfo (IN) Pointer to the SLPIfaceInfo structure that contains *                   information about the interfaces to send on *    msg       (IN) Buffer to send * *   socks      (OUT) Sockets used broadcast multicast.  May be used to  *                    recv() responses.  MUST be close by caller using  *                    SLPXcastSocketsClose()  * * Returns: *    Zero on sucess.  Non-zero with errno set on error *========================================================================*/{    int                 xferbytes;    int                 flags = 0;  #ifdef _WIN32    char    on = 1;#else    int     on = 1;#endif#if defined(MSG_NOSIGNAL)    flags = MSG_NOSIGNAL;#endif    for (socks->sock_count = 0;          socks->sock_count < ifaceinfo->iface_count;          socks->sock_count++)    {        socks->sock[socks->sock_count] = socket(AF_INET, SOCK_DGRAM, 0);        if (socks->sock[socks->sock_count] < 0)        {            /* error creating socket */            return -1;        }                if( (setsockopt(socks->sock[socks->sock_count],                        SOL_SOCKET,                         SO_BROADCAST,                         &on,                         sizeof(on))) )        {            /* Error setting socket option */            return -1;        }        socks->peeraddr[socks->sock_count].sin_family = AF_INET;        socks->peeraddr[socks->sock_count].sin_port = htons(SLP_RESERVED_PORT);        socks->peeraddr[socks->sock_count].sin_addr.s_addr = ifaceinfo->bcast_addr[socks->sock_count].sin_addr.s_addr;        xferbytes = sendto(socks->sock[socks->sock_count],                            msg->start,                           msg->end - msg->start,                           0,                           (struct sockaddr *) &(socks->peeraddr[socks->sock_count]),                           sizeof(struct sockaddr_in));        if(xferbytes  < 0)        {             /* Error sending to broadcast */            return -1;        }    }      return 0;}/*========================================================================*/int SLPMulticastSend(const SLPIfaceInfo* ifaceinfo,                      SLPBuffer msg,                     SLPXcastSockets* socks)/* Description: *    Multicast a message. * * Parameters: *    ifaceinfo (IN) Pointer to the SLPIfaceInfo structure that contains *                   information about the interfaces to send on *    msg       (IN) Buffer to send * *   socks      (OUT) Sockets used to multicast.  May be used to recv()  *                    responses.  MUST be close by caller using  *                    SLPXcastSocketsClose()  * * Returns: *    Zero on sucess.  Non-zero with errno set on error *========================================================================*/{    int             flags = 0;    int             xferbytes;    struct in_addr  saddr;    int		    optarg;#if defined(MSG_NOSIGNAL)    flags = MSG_NOSIGNAL;#endif    optarg = atoi(SLPPropertyGet("net.slp.multicastTTL"));    for (socks->sock_count = 0;         socks->sock_count < ifaceinfo->iface_count;         socks->sock_count++)    {        socks->sock[socks->sock_count] = socket(AF_INET, SOCK_DGRAM, 0);        if (socks->sock[socks->sock_count] < 0)        {            /* error creating socket */            return -1;        }                saddr.s_addr = ifaceinfo->iface_addr[socks->sock_count].sin_addr.s_addr;        if( setsockopt(socks->sock[socks->sock_count],                        IPPROTO_IP,                        IP_MULTICAST_IF,                        (char*)&saddr,                        sizeof(struct in_addr)))        {            /* error setting socket option */            return -1;        }        if(setsockopt(socks->sock[socks->sock_count],                      IPPROTO_IP,                      IP_MULTICAST_TTL,                      (char*)&optarg,                      sizeof(optarg)))        {            return -1;        }        socks->peeraddr[socks->sock_count].sin_family = AF_INET;        socks->peeraddr[socks->sock_count].sin_port = htons(SLP_RESERVED_PORT);        socks->peeraddr[socks->sock_count].sin_addr.s_addr = htonl(SLP_MCAST_ADDRESS);        xferbytes = sendto(socks->sock[socks->sock_count],                           msg->start,                           msg->end - msg->start,                           flags,                           (struct sockaddr *) &(socks->peeraddr[socks->sock_count]),                           sizeof(struct sockaddr_in));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -