大家好,我现在正在学基于c#的网络编程.
现在我想学关于在一个网段内进行多播的技术,大家可以帮我找找关于这方面的代码吗.
如果是关于多播的原理也可以,只要和多播有关的资料,我都需要,不管是网页还是电子书.
如果有的话,可以发给我吗. email: [email protected]
谢谢了
现在我想学关于在一个网段内进行多播的技术,大家可以帮我找找关于这方面的代码吗.
如果是关于多播的原理也可以,只要和多播有关的资料,我都需要,不管是网页还是电子书.
如果有的话,可以发给我吗. email: [email protected]
谢谢了
C的代码有 windows网络编程 C sharp就不晓得啦。
作者/JSPHuang
下载源代码
UDP 是USER DATAGRAM PROTOCAL 的简称,是一种在网络上提供的无连接的传输协议。
用UDP通信有以下特点: 1、 数据传输不用建立连接,所以不可靠;
2、 数据的发送是面向整个网络的,任何一台在局域网内的计算机都可以接收到相同的数据;
具体实现很简单,但是现在在网络上很少看到这方面的代码;我也参考了VCKBASE上的关于UDP通信的原代码和一些书籍,写了这个简单的客户端,接收端程序,起到抛砖引玉的作用,希望能给初次接触UDP之BROADCAST编程的同志一些参考。下面就让我来说一下工作流程, 接收端的程序: 启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);
然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息; ......
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050); from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);
int fromlength=sizeof(SOCKADDR);
//用UDP初始化套接字
s=socket(AF_INET,SOCK_DGRAM,0);
//设置该套接字为广播类型,
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
//把该套接字绑定在一个具体的地址上
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256];
while(1)
{ //从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
Sleep(2000);
printf("%s\n",buf);
ZeroMemory(buf,256);
}
.....
无连接协议不用LISTEN也不用ACCEPT,他直接从广播地址上接收消息,但我们必须要设置该套接字为广播类型。
发送端的程序比较简单,只要将发送地址改为广播地址,设置套接字为BROADCAST类型就行,具体实现细节请参见源代码。
在VC6。0 WIN 2000下运行通过。
只有UDP才能实现多播,TCP/IP不能!#include <windows.h>
#include <winsock.h>#include <stdio.h>
#include <stdlib.h>
#include <conio.h>#define MCASTADDR "239.1.1.1"
#define MCASTPORT 5000
#define BUFSIZE 1024
#define DEFAULT_COUNT 500BOOL bSender = FALSE;
BOOL bLoopBack = FALSE ;DWORD dwInterface,
dwMulticastGroup,
dwCount ;short iPort ;DWORD WINAPI my_send(void *);
DWORD WINAPI my_receive(void *);void usage(char *progname)
{
printf("example of multicast:%s -s -m:str -p:int -i:str -1 -n:\n",progname);
}
void ValidateArgs(int argc, char **argv)
{
dwInterface = INADDR_ANY;
dwMulticastGroup = inet_addr(MCASTADDR);
iPort = MCASTPORT ;
dwCount = DEFAULT_COUNT ; if(tolower(*argv[1]) == 's')
{
bSender = TRUE ;
}
return ;
} const int on = 1;
WSADATA wsd;
struct sockaddr_in local,
remote,
from;
char recvbuf[BUFSIZE],
sendbuf[BUFSIZE];
struct ip_mreq mcast;
SOCKET sockM,sockN;
int len = sizeof(struct sockaddr_in),
optval,
ret;
int x = -1;
int main(int argc, char **argv)
{
DWORD i = 0;
DWORD dwThreadId_send = 0;
DWORD dwThreadId_recv = 0;
HANDLE send_Thread = NULL;
HANDLE recv_Thread = NULL;
DWORD dwVesion = 0; strcpy(sendbuf, "hello");
ValidateArgs(argc, argv);
if(WSAStartup(MAKEWORD(2,0),&wsd)!=0)
{
printf("WSAStartup failed\n");
WSACleanup();
return -1 ;
} if((sockM = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("soket failed with: %d\n", WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}
if((sockN = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("soket failed with: %d\n", WSAGetLastError());
closesocket(sockN);
WSACleanup();
return -1;
}
setsockopt(sockM, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
setsockopt(sockN, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
local.sin_family = AF_INET ;
local.sin_port = htons(iPort) ;
local.sin_addr.S_un.S_addr = dwInterface ;
// printf("haha\n\n\n\n\nhaha");
if(bind(sockM,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)
{
printf("bind failed") ;
closesocket(sockM) ;
WSACleanup() ;
return -1 ;
}
if(bind(sockN,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)
{
printf("bind failed") ;
closesocket(sockN) ;
WSACleanup() ;
return -1 ;
}
remote.sin_family = AF_INET ;
remote.sin_port = htons(iPort) ;
remote.sin_addr.S_un.S_addr = dwMulticastGroup ; mcast.imr_multiaddr.S_un.S_addr = dwMulticastGroup ;
mcast.imr_interface.S_un.S_addr = dwInterface ;
if(setsockopt(sockM, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast)) ==SOCKET_ERROR)
{
printf("setsockopt(IP_ADD_MEMBERSHIP) failed: %d\n:", WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}
optval = 8;
if(setsockopt(sockM, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&optval, sizeof(int)) ==SOCKET_ERROR)
{
printf("setsockopt(IP_MULTICAST_TTL) failed: %d\n:", WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}
if(bLoopBack)
{
/* optval = 0;
if(setsockopt(sockM, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&optval, sizeof(optval)) ==SOCKET_ERROR)
{
printf("setsockopt(IP_MULTICAST_LOOP) failed: %d\n:", WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}
*/ }
send_Thread = CreateThread(
NULL, // default security attributes
0, // use default stack size
my_send, // thread function
NULL, // argument to thread function
0, // use default creation flags
&dwThreadId_send); // returns the thread identifier recv_Thread = CreateThread(
NULL, // default security attributes
0, // use default stack size
my_receive, // thread function
NULL, // argument to thread function
0, // use default creation flags
&dwThreadId_recv); // returns the thread identifier
x = getch(); CloseHandle( recv_Thread );
CloseHandle( send_Thread ); if(setsockopt(sockM, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&mcast, sizeof(mcast)) ==SOCKET_ERROR)
{
printf("setsockopt(IP_DROP_MEMBERSHIP) failed: %d\n:", WSAGetLastError());
}
closesocket(sockM);
closesocket(sockN);
WSACleanup();
return 0;
}DWORD WINAPI my_send(void * p)
{
unsigned long i = 0;
for(i=0; i<dwCount; i++)
{ itoa(i,sendbuf,10);
printf("server 1: This is a test :%s \n",sendbuf);
if(sendto(sockN, (char*)sendbuf, strlen(sendbuf), 0, (struct sockaddr*)&remote, sizeof(remote)) == SOCKET_ERROR)
{
printf("sendto failed with : %d\n",WSAGetLastError());
closesocket(sockN);
WSACleanup();
return -1;
}
Sleep(1000);
}
return 0;
}DWORD WINAPI my_receive(void * p)
{
unsigned long i = 0;
for(i = 0; i<dwCount; i++)
{
Sleep(500);
memset(recvbuf,0,BUFSIZE);
if((ret = recvfrom(sockM, recvbuf, BUFSIZE, 0, (struct sockaddr *)&from, &len)) == SOCKET_ERROR)
{
printf("recvfrom failed with: %d\n:", WSAGetLastError());
printf("sdf\n");
closesocket(sockM);
WSACleanup();
return -1;
}
printf("RECV: '%s' from <%s>\n", recvbuf ,inet_ntoa(from.sin_addr));
}
return 0;
}
谁说TCP/IP不能?