阅读:889回复:1
程序人生离不开程序,灌水也要灌代码
哪位大虾对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 |
|
|
沙发#
发布于:2002-11-22 22:12
太长,哪句错了?
|
|