救命!!Help!!快帮忙!!(组播)

syk0000 2002-06-04 09:11:46
加精
是这样的,昨天我发了一个问题,可是没有人告诉我答案,小弟只好痛下决心,请大侠给个建议,有100分相赠!!!

请哪位大侠详细告诉如何实现一个多播(组播)?给出函数就有分,如果能给出代码就更好了,:-)
条件如下:
1、用Winsock2
2、无根多播
3、非阻塞模式(nonblocking)
4、重叠I/O(OVERLAPPED)
5、最重要的,要求能在2000下调试通过。

小弟曾做了一个,在win98下没有问题,可是在2000下有问题,百般调试无法解决,只好决定从头开始。
...全文
33 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuying 2002-06-05
  • 打赏
  • 举报
回复
你创建了这个socket并设置其接收组播数据后,就可以象一般的socket一样使用各种i/o模型,如使用WSAAsyncSelect()注册消息。

具体可以参考:<windows网络编程技术>
xuying 2002-06-05
  • 打赏
  • 举报
回复
不会啊,我在2000 server下编译运行正常。
在组播支持上2000和98差别不大。至少2000支持的比98多。
syk0000 2002-06-05
  • 打赏
  • 举报
回复
可是我觉得这句代码:if (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&multicast,sizeof(multicast)) < 0 ) 用到的multicast好像winsock2不支持的啊。

而且我想知道2000和98问题处在哪?:-<
syk0000 2002-06-05
  • 打赏
  • 举报
回复
谢谢大家,尤其是xuying,给了我莫大的勇气;还有afoolboy,我看到你的回复的时候我自己已经做出来了,虽然还没有收到你的mail,但我仍感谢你的关注。

由于问题已经解决,特此作出加分决定,给予xuying 100分,至于afoolboy,在我发的另一篇问题中,已经加分80,我想还比较公平吧,呵呵。

再次谢谢大家。
syk0000 2002-06-05
  • 打赏
  • 举报
回复
我的邮箱:syk0000@163.com

谢谢大家。
利友视讯 2002-06-05
  • 打赏
  • 举报
回复
syk0000(努力中) ,我刚看到你上一个答案,去看我的回答吧http://www.csdn.net/expert/topic/774/774636.xml?temp=.6188318
syk0000 2002-06-04
  • 打赏
  • 举报
回复
感谢xuying,我受益非浅,但我还想知道,若用消息驱动,当有网络数据到来时告诉View进行处理,该如何实现?
还有,若我想用同一个Socket实现接收和发送,该如何实现?
xuying 2002-06-04
  • 打赏
  • 举报
回复
// 接收端
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define BUFFSIZE 2048
#define RECV_IP_ADDR "224.8.8.1"
#define DEST_PORT 8888

int main(int argc,char *argv[])
{
int sockfd;
int sock_reuse = 1;
struct ip_mreq multicast;
struct sockaddr_in recver_addr;
char szError[100];

int index = 0, // Integer index
iRecvLen; // Length of recv_sin
char szMessageA[1024*320]; // ASCII string
TCHAR szMessageW[1024*320]; // Unicode string

WSADATA WSAData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup (wVersionRequested , &WSAData) != 0)
{
printf ("recver:Initialize Winsock error!");
exit(1);
}
if (LOBYTE(WSAData.wVersion) != 2 || HIBYTE(WSAData.wVersion) != 2 ) {
WSACleanup( );
printf ("setsockopt failed! Error: %d", WSAGetLastError ());
exit(1);
}

multicast.imr_multiaddr.s_addr = inet_addr(RECV_IP_ADDR);
multicast.imr_interface.s_addr = htonl(INADDR_ANY);
recver_addr.sin_family = AF_INET;
recver_addr.sin_port = htons(DEST_PORT);
recver_addr.sin_addr.s_addr = INADDR_ANY;

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("recver:new a socket error!\n");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&sock_reuse, sizeof(sock_reuse)) < 0) {
printf("recver : socket options set error");
exit(1);
}

if (bind(sockfd,(struct sockaddr *)&recver_addr,sizeof(recver_addr)) < 0) {
closesocket(sockfd);
printf("recver:bind socket error!\n");
exit(1);
}

if (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&multicast,sizeof(multicast)) < 0 ) {
sprintf (szError, TEXT("setsockopt failed! Error: %d"), WSAGetLastError ());
printf("%s\n", szError);
closesocket(sockfd);
exit(1);
}

printf("Receive on %s:%d\n", RECV_IP_ADDR, DEST_PORT);
iRecvLen = sizeof (recver_addr);
memset(szMessageA, 0, sizeof(szMessageA));
// Receive data from the multicasting group server.
if (recvfrom (sockfd,
szMessageA,
sizeof(szMessageA),
0,
(struct sockaddr FAR *) &recver_addr,
&iRecvLen) == SOCKET_ERROR)
{
wsprintf (szError, TEXT("recvfrom failed! Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (sockfd);
return FALSE;
}
else
{
// Convert the ASCII string to a Unicode string.
for (index = 0; index <= sizeof (szMessageA); index++)
szMessageW[index] = szMessageA[index];

MessageBox (NULL, szMessageW, TEXT("Info"), MB_OK);
}

// Disable receiving on Sock before closing it.
shutdown (sockfd, 0x00);

// Close Sock.
closesocket (sockfd);

WSACleanup ();
return 0;
}
xuying 2002-06-04
  • 打赏
  • 举报
回复
// 发送端
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define BUFFSIZE 2048
#define IP_ADDR "224.8.8.1"
#define DEST_PORT 8888

int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in addr;
char szError[100];
char buf[] = "Hello, World!";
int ttl = 255 ; // Arbitrary TTL value.

WSADATA WSAData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup (wVersionRequested , &WSAData) != 0)
{
printf ("recver:Initialize Winsock error!");
exit(1);
}
if (LOBYTE(WSAData.wVersion) != 2 || HIBYTE(WSAData.wVersion) != 2 ) {
WSACleanup( );
printf ("setsockopt failed! Error: %d", WSAGetLastError ());
exit(1);
}

addr.sin_family = AF_INET;
addr.sin_port = htons(DEST_PORT);
addr.sin_addr.s_addr = inet_addr(IP_ADDR);

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("sender:new a socket error!\n");
exit(1);
}

if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl))!=0)
{
printf("error setsockopt IP_MULTICAST_TTL\n");
exit(1);
}
/*
if (bind(sockfd,(struct sockaddr *)&recver_addr,sizeof(recver_addr)) < 0) {
closesocket(sockfd);
printf("recver:bind socket error!\n");
exit(1);
}
*/

if (sendto (sockfd, buf, sizeof(buf) , 0, (struct sockaddr *)&addr, sizeof(addr))
== SOCKET_ERROR)
{
wsprintf (szError, TEXT("sendto failed! Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (sockfd);
return FALSE;
}
else
{
printf("send ok\n");
}

// Close Sock.
closesocket (sockfd);
WSACleanup ();
return 0;
}

4,387

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧