fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
阅读:889回复:1

程序人生离不开程序,灌水也要灌代码

楼主#
更多 发布于:2002-11-22 17:48
哪位大虾对winsock2熟悉,帮忙看一下下面的代码:

// 将字符串地址转换为套接字地址
nRet = WSAStringToAddress ( strDestMulti, /* address string */
    AF_INET,                /* address family */
    NULL,                   /* protocol info structure */
    (LPSOCKADDR)&stDestAddr,/* socket address string */
    &iLen);                 /* length of socket structure */
if (nRet) {
  printf (\"WSAStringToAddress(%s) failed, Err: \\
          %d\\n\", strDestMulti, WSAGetLastError());
  exit(1);
}

// 创建一个多址广播套接字
hSock = WSASocket(AF_INET, SOCK_DGRAM,  IPPROTO_UDP,\\
          (LPWSAPROTOCOL_INFO)NULL, 0,
          WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF);

if (hSock == INVALID_SOCKET) {
  printf (\"WSASocket() failed, Err: %d\\n\", WSAGetLastError());
  exit (1);
}

bFlag = TRUE; // 设置套接字为可重用端口地址
nRet = setsockopt(hSock,    /* socket */
         SOL_SOCKET,        /* socket level */
         SO_REUSEADDR,     /* socket option */
        (char *)&bFlag,    /* option value */
        sizeof (bFlag));   /* size of value */
if (nRet == SOCKET_ERROR)
  printf(\"setsockopt() SO_REUSEADDR failed, Err: %d\\n\", WSAGetLastError());

// 将套接字绑扎到用户指定端口及默认的接口
stSrcAddr.sin_family = PF_INET;
stSrcAddr.sin_port = htons (nDestPort);
stSrcAddr.sin_addr.s_addr = INADDR_ANY;
nRet = bind (hSock, (struct sockaddr FAR *)&stSrcAddr, sizeof(struct sockaddr));
if (nRet == SOCKET_ERROR)
  printf (\"bind failed, Err: %d\\n\", WSAGetLastError());

// 设置多址广播数据报传播范围(TTL)
nRet = WSAIoctl (hSock,              /* socket */
        SIO_MULTICAST_SCOPE, /* IP Time-To-Live */
        &nIP_TTL,                   /* input */
        sizeof (nIP_TTL),             /* size */
        NULL,                           /* output */
        0,                         /* size */
        &cbRet,                    /* bytes returned */
        NULL,                       /* overlapped */
        NULL);                /* completion routine */
if (nRet)
  printf (\"WSAIoctl(SIO_MULTICAST_SCOPE) failed, Err: %d\\n\", WSAGetLastError());

// 允许内部回送(LOOPBACK)。Windows 95不支持改选项
bFlag = TRUE;
nRet = WSAIoctl (hSock,           /* socket */
        SIO_MULTIPOINT_LOOPBACK, /* LoopBack on or off */
        &bFlag,                   /* input */
        sizeof (bFlag),           /* size */
        NULL,                 /* output */
        0,                       /* size */
        &cbRet,                  /* bytes returned */
        NULL,                    /* overlapped */
        NULL);                  /* completion routine */
if (nRet)
  printf(\"WSAIoctl(SIO_MULTIPOINT_LOOPBACK) failed, Err: %d\\n\", WSAGetLastError());

stDestAddr.sin_family = PF_INET;
        nRet = WSAHtons( hSock,      /* socket */
        nDestPort,                  /* host order value */
        &(stDestAddr.sin_port));   /* network order value */
if (nRet == SOCKET_ERROR)
  printf(\"WSAHtons() failed, Err: %d\\n\", WSAGetLastError());

// 加入到指定多址广播组,指定为既作发送者又作接收者
// 在IP multicast中,返回的套接字描述符和输入的套接字描述符相同。
hNewSock = WSAJoinLeaf (hSock, /* socket */
        (PSOCKADDR)&stDestAddr, /* multicast address */
        sizeof (stDestAddr),/* length of addr struct */
        NULL,                   /* caller data buffer */
        NULL,                   /* callee data buffer */
        NULL,                   /* socket QOS setting */
        NULL,                   /* socket group QOS */
        JL_BOTH);      /* do both: send *and* receive */
if (hNewSock == INVALID_SOCKET)
  printf (\"WSAJoinLeaf() failed, Err: %d\\n\", WSAGetLastError());

// 在循环中发送/接收数据。测试时可以改为无限循环
for (i=0;i<LOOPCOUNT;i++) {
      static iCounter = 1;
      stWSABuf.buf = achOutBuf;
      stWSABuf.len = lstrlen(achOutBuf);

      cbRet = 0;
      itoa(iCounter++, &achOutBuf[16], 10);
      nRet = WSASendTo (hSock,  /* socket */
                     &stWSABuf,/* output buffer structure */
                     1,          /* buffer count */
                     &cbRet,    /* number of bytes sent */
                     0,            /* flags */
                     (struct sockaddr*)&stDestAddr,   /* destination address */
                     sizeof(struct sockaddr),  /* size of addr structure */
                     NULL,   /* overlapped structure */
                     NULL); /* overlapped callback function */
if (nRet == SOCKET_ERROR)
  printf(\"WSASendTo() failed, Err: %d\\n\", WSAGetLastError());

stWSABuf.buf = achInBuf;
stWSABuf.len = BUFSIZE;
cbRet = 0;
iLen = sizeof (stSrcAddr);
dFlag = 0;
nRet = WSARecvFrom (hSock,    /* socket */
           &stWSABuf,         /* input buffer structure */
           1,                /* buffer count */
           &cbRet,          /* number of bytes recv\'d */
           &dFlag,              /* flags */
         (struct sockaddr *)&stSrcAddr     /* source address */
          &iLen,                            /* size of addr structure */
          NULL,                             /* overlapped structure */
          NULL);                            /* overlapped callback function */
if (nRet == SOCKET_ERROR)
  printf(\"WSARecvFrom() failed, Err:%d\\n\", WSAGetLastError());
else {
  u_short nPort = 0;
  char achAddr[MAXADDRSTR+3] = {0}; // 如果长度太小则返回Windows错误122
  iLen = MAXADDRSTR+3;
  nRet = WSAAddressToString(   // 将地址转换为字符串
                (struct sockaddr *)&stSrcAddr,  /* source address */
                sizeof(stSrcAddr), /* size of addr struct */
                NULL,         /* protocol info */
                achAddr,      /* address string */
                &iLen);       /* addr string buf len */
  if (nRet == SOCKET_ERROR)
     printf(\"WSAAddressToString() failed, Err: %d\\n\", WSAGetLastError());
  nRet = WSANtohs(hSock,        /* socket */
          stSrcAddr.sin_port,   /* host order value */
          &nPort);              /* network order value */
  if (nRet == SOCKET_ERROR)
    printf(\"WSANtohs() failed, Err: %d\\n\", WSAGetLastError());
  printf (\"WSARecvFrom() received %d bytes from %s, port %d :%s\\r\\n\", cbRet, achAddr[0] ? achAddr : \"??\", nPort, achInBuf);
  }
} /* end for(;;) */

  closesocket(hNewSock);
  closesocket(hSock);
  // 卸载WinSock DLL
  WSACleanup();
  return (0);
} /* end main() */


现在问题是:在2000的环境下为什么不能发送数据包?发包时返回的错误是10004:对应socket error类型:WSaEINVAL
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
沙发#
发布于:2002-11-22 22:12
太长,哪句错了?
游客

返回顶部