3459|3

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

setsockopt 函数如何使用? [复制链接]

我的发送程序
#include "vxWorks.h"
#include "fioLib.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "usrLib.h"
#include "errnoLib.h"
#include "hostLib.h"
#include "sockLib.h"
#include "socket.h"
#include "inetLib.h"
#include "in.h"
#define SOCKET_ERROR -1
#if 1
int testsend(void)
{
    int   eno,fd;
    struct sockaddr_in sa;
    char  buf[]  =  "Hello,  World!";
    int   sock_reuse  = 1;
    int   loopback    = 1;
    int   ttl         = 50;
    int quitting      = -1;

    sa.sin_family      = AF_INET;
    sa.sin_port        = htons(5100);
    sa.sin_addr.s_addr = inet_addr("224.1.2.1");

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd == -1)
    {
        printf("Couldn't create a UDP socket\n");
        return -1;
    }

    if(setsockopt(fd,  SOL_SOCKET,  SO_REUSEADDR,  (char  *)&sock_reuse,  sizeof(sock_reuse))  <  0)
    {
         printf("socket  options  set  error:reuse\n");
         close(fd);
         return -1;
    }

    if((eno = setsockopt(fd,IPPROTO_IP,  IP_MULTICAST_TTL,  (char  *)&ttl,  sizeof(int)))<0)
    {
         printf("socket  options  set  error:TTL eno:%d\n",eno);
         close(fd);
         return -1;
    }

    if(setsockopt(fd,IPPROTO_IP,  IP_MULTICAST_LOOP,  (char  *)&loopback,  sizeof(int))<0)
    {
         printf("socket  options  set  error:loopback\n");
         close(fd);
         return -1;
    }

    while(!quitting)
    {
         if(sendto(fd,buf,sizeof(buf),0,(struct  sockaddr  *)&sa,sizeof(sa))== SOCKET_ERROR)
         {
             printf("Send error!\n");
             close(fd);
             return -1;
         }else
         {
             printf("Send OK\n!");
         }
         taskDelay(1);
    }
    close(fd);
}
#endif

运行的时候setsockopt 函数返回错误,就不能发送

最新回复

数据类型  详情 回复 发表于 2007-5-8 15:03
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我的接收程序
#if 0
#include "vxWorks.h"
#include "fioLib.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "usrLib.h"
#include "errnoLib.h"
#include "hostLib.h"
#include "sockLib.h"
#include "socket.h"
#include "inetLib.h"
#include "in.h"
#endif

#include "vxWorks.h"
#include "sys/types.h"
#include "ioLib.h"
#include "fioLib.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "usrLib.h"
#include "errnoLib.h"
#include "hostLib.h"
#include "sockLib.h"
#include "socket.h"
#include "inetLib.h"
#include "in.h"

#define SOCKET_ERROR -1
int testrecv(void)
{
   
    int    len,fd,sock_reuse  =  1;
     int quitting = 0;
    struct sockaddr_in sa;
    struct ip_mreq  multicast;
   
    char   buf[1024];

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd == -1)
    {
        printf("Couldn't create a UDP socket\n");
        return -1;
    }
#if 0
multicast.imr_multiaddr.s_addr  =  inet_addr(RECV_IP_ADDR);
    multicast.imr_interface.s_addr  =  htonl(INADDR_ANY); multicast.imr_interface.s_addr  =  htonl("192.168.0.31");
#endif
#if 1
multicast.imr_multiaddr.s_addr  =  inet_addr("224.1.2.1");
   
   multicast.imr_interface.s_addr  =  htonl(INADDR_ANY);

#endif

    sa.sin_family = AF_INET;
#if 0
    sa.sin_port = htons(RECV_PORT);
#endif
    sa.sin_port = htons(5100);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);

    if(setsockopt(fd,  SOL_SOCKET,  SO_REUSEADDR,  (char  *)&sock_reuse,  sizeof(sock_reuse))  <  0)
    {
         printf("socket  options  set  error:reuse\n");
         close(fd);
         return -1;
    }

    if (bind(fd, (struct sockaddr *) &sa, (int) sizeof(sa)) == -1)
    {
         printf("Couldn't bind a UDP socket to port %d\n", 6666);
         close(fd);
         return -1;
    }

    if(setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char  *)&multicast,sizeof(multicast))  <  0  )
    {
         printf("socket  options  set  error:multicast\n");
         close(fd);
         return -1;
    }

    while(!quitting)
    {
        memset(buf,0,sizeof(buf));
        if(recvfrom(fd,buf,sizeof(buf),0, (struct  sockaddr *)&sa, &len) ==  SOCKET_ERROR)
        {
             printf("Recv error!\n");
             close(fd);
             return -1;
        }
        else
        {
             printf("Recv data:%s",buf);
        }
    }
    close(fd);
}
接收执行的时候setsockopt还是返回错误,导致接收不成功,想问问是什么原因导致的?
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
网卡工作是正常的,我可以ping通
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
数据类型
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表