网络udp多播的问题

lpfreemail 2005-03-21 10:20:42
请问如何通过winsock.h编写网络多播的程序,请提供原码,分不够还有,急急急急急!
...全文
277 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiyue2010 2005-06-17
  • 打赏
  • 举报
回复
//
// Function: main
//
// Description:
// Parse the command line arguments, load the Winsock library,
// create a socket and join the multicast group. If this program
// is run as a sender then begin sending messages to the multicast
// group; otherwise, call recvfrom() to read messages sent to the
// group.
//
int main(int argc, char **argv)
{
WSADATA wsd;
struct sockaddr_in local,
remote,
from;
SOCKET sock, sockM;
TCHAR recvbuf[BUFSIZE],
sendbuf[BUFSIZE];
int len = sizeof(struct sockaddr_in),
optval,
ret;
DWORD i=0;

// Parse the command line and load Winsock
//
ValidateArgs(argc, argv);

if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("WSAStartup() failed\n");
return -1;
}
// Create the socket. In Winsock 2 you do have to specify the
// multicast attributes that this socket will be used with.
//
if ((sock = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0,
WSA_FLAG_MULTIPOINT_C_LEAF
| WSA_FLAG_MULTIPOINT_D_LEAF
| WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("socket failed with: %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
// Bind to the local interface. This is done to receive data.
local.sin_family = AF_INET;
local.sin_port = htons(iPort);
local.sin_addr.s_addr = dwInterface;

if (bind(sock, (struct sockaddr *)&local,
sizeof(local)) == SOCKET_ERROR)
{
printf("bind failed with: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
// Setup the SOCKADDR_IN structure describing the multicast
// group we want to join
//
remote.sin_family = AF_INET;
remote.sin_port = htons(iPort);
remote.sin_addr.s_addr = dwMulticastGroup;
//
// Change the TTL to something more appropriate
//
optval = 8;
if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL,
(char *)&optval, sizeof(int)) == SOCKET_ERROR)
{
printf("setsockopt(IP_MULTICAST_TTL) failed: %d\n",
WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
// Disable loopback if needed
//
if (bLoopBack)
{
optval = 0;
if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP,
(char *)&optval, sizeof(optval)) == SOCKET_ERROR)
{
printf("setsockopt(IP_MULTICAST_LOOP) failed: %d\n",
WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
}
// Join the multicast group. Note that sockM is not used
// to send or receive data. It is used when you want to
// leave the multicast group. You simply call closesocket()
// on it.
//
if ((sockM = WSAJoinLeaf(sock, (SOCKADDR *)&remote,
sizeof(remote), NULL, NULL, NULL, NULL,
JL_BOTH)) == INVALID_SOCKET)
{
printf("WSAJoinLeaf() failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}

if (!bSender) // Receiver
{
// Receive data
//
for(i = 0; i < dwCount; i++)
{
if ((ret = recvfrom(sock, recvbuf, BUFSIZE, 0,
(struct sockaddr *)&from, &len)) == SOCKET_ERROR)
{
printf("recvfrom failed with: %d\n",
WSAGetLastError());
closesocket(sockM);
closesocket(sock);
WSACleanup();
return -1;
}
recvbuf[ret] = 0;
printf("RECV: '%s' from <%s>\n", recvbuf,
inet_ntoa(from.sin_addr));
}
}
else // Sender
{
// Send data
//
for(i = 0; i < dwCount; i++)
{
sprintf(sendbuf, "server 1: This is a test: %d", i);
if (sendto(sock, (char *)sendbuf, strlen(sendbuf), 0,
(struct sockaddr *)&remote,
sizeof(remote)) == SOCKET_ERROR)
{
printf("sendto failed with: %d\n",
WSAGetLastError());
closesocket(sockM);
closesocket(sock);
WSACleanup();
return -1;
}
Sleep(500);
}
}
// Leave the multicast group by closing sock
// For non-rooted control and data plane schemes, WSAJoinLeaf
// returns the same socket handle that you pass into it.
//
closesocket(sock);

WSACleanup();
return -1;
}
aiyue2010 2005-06-17
  • 打赏
  • 举报
回复
#include <winsock2.h>
#include <ws2tcpip.h>

#include <stdio.h>
#include <stdlib.h>

#define MCASTADDR "234.5.6.7"
#define MCASTPORT 25000
#define BUFSIZE 1024
#define DEFAULT_COUNT 500

BOOL bSender = FALSE, // Act as a sender?
bLoopBack = FALSE; // Disable loopback?

DWORD dwInterface, // Local interface to bind to
dwMulticastGroup, // Multicast group to join
dwCount; // Number of messages to send/receive

short iPort; // Port number to use

//
// Function: usage
//
// Description:
// Print usage information and exit
//
void usage(char *progname)
{
printf("usage: %s -s -m:str -p:int -i:str -l -n:int\n",
progname);
printf(" -s Act as server (send data); otherwise\n");
printf(" receive data.\n");
printf(" -m:str Dotted decimal multicast IP addres "
"to join\n");
printf(" The default group is: %s\n", MCASTADDR);
printf(" -p:int Port number to use\n");
printf(" The default port is: %d\n", MCASTPORT);
printf(" -i:str Local interface to bind to; by default \n");
printf(" use INADDRY_ANY\n");
printf(" -l Disable loopback\n");
printf(" -n:int Number of messages to send/receive\n");
ExitProcess(-1);
}

//
// Function: ValidateArgs
//
// Description
// Parse the command line arguments and set some global flags
// depeding on the values
//
void ValidateArgs(int argc, char **argv)
{
int i;

dwInterface = INADDR_ANY;
dwMulticastGroup = inet_addr(MCASTADDR);
iPort = MCASTPORT;
dwCount = DEFAULT_COUNT;

for(i=1; i < argc ;i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 's': // Sender
bSender = TRUE;
break;
case 'm': // Multicast group to join
if (strlen(argv[i]) > 3)
dwMulticastGroup = inet_addr(&argv[i][3]);
break;
case 'i': // Local interface to use
if (strlen(argv[i]) > 3)
dwInterface = inet_addr(&argv[i][3]);
break;
case 'p': // Port to use
if (strlen(argv[i]) > 3)
iPort = atoi(&argv[i][3]);
break;
case 'l': // Disable loopback
bLoopBack = TRUE;
break;
case 'n': // Number of messages to send/recv
dwCount = atoi(&argv[i][3]);
break;
default:
usage(argv[0]);
break;
}
}
}
return;
}
xxrl 2005-06-17
  • 打赏
  • 举报
回复
在两台机器上运行
xxrl 2005-06-17
  • 打赏
  • 举报
回复
//client代码:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")

//常量定义
#define BUFSIZE 1024
#define TTL_VALUE 255
#define TIME_OUT 2
#define TEST_ADDR "234.5.6.7"
#define TEST_PORT 9200
#define LOOPMAX 10000

int main(int argc, char* argv[])
{
struct sockaddr_in stto;
char achout[BUFSIZE]; //要发送的信息
WSADATA stwsa;
SOCKET s;
int i, itmp, iret, addr_size;

itmp = WSAStartup(MAKEWORD(2, 2), &stwsa);
if (itmp)
{
printf("Call WSAStartup failed. Return value: %d\t\n", itmp);
exit(1);
}
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("Call socket failed. Error number: %d\t\n", WSAGetLastError());
exit(1);
}
//组播组的地址信息
stto.sin_family = AF_INET;
stto.sin_addr.s_addr = inet_addr(TEST_ADDR);
stto.sin_port = htons(TEST_PORT);
//开始发送并接收信息
addr_size = sizeof(struct sockaddr_in);
for (i = 0; i < LOOPMAX; i++)
{
printf("Input the message: ");
scanf("%s", achout);
printf("Now sending to multicast group, address: %s\n", TEST_ADDR);
iret = sendto(s, achout, sizeof(achout), 0, (struct sockaddr *)&stto, addr_size);
if (iret == SOCKET_ERROR)
{
printf("Call sendto failed. Error number: %d\t\n", WSAGetLastError());
exit(1);
}
}

closesocket(s);
WSACleanup();

system("PAUSE");
return 0;
}
xxrl 2005-06-17
  • 打赏
  • 举报
回复
//server代码:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")

#define BUFSIZE 1024
#define TTL_VALUE 255
#define TIME_OUT 10000
#define TEST_ADDR "234.5.6.7"

#define TEST_PORT 9200
#define LOOPMAX 20

int main(int argc, char* argv[])
{
struct sockaddr_in stlocal, stfrom;
char achin[BUFSIZE];
struct ip_mreq stmrep;
WSADATA stwsa;
SOCKET s;
int i, itmp, iret, addr_size;

itmp = WSAStartup(MAKEWORD(2, 2), &stwsa);
if (itmp)
{
printf("Call WSAStartup failed. Return value: %d\t\n", itmp);
exit(1);
}
//创建数据报套接字
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("Call socket failed. Error number: %d\t\n", WSAGetLastError());
exit(1);
}
//设置socket属性
itmp = TRUE;
iret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&itmp, sizeof(int));
if (iret == SOCKET_ERROR)
{
printf("Call setsockopt SO_REUSEADDR failed. Error number: %d\t\n",
WSAGetLastError());
exit(1);
}
stlocal.sin_family = AF_INET;
stlocal.sin_addr.s_addr = INADDR_ANY;
stlocal.sin_port = htons(TEST_PORT);
iret = bind(s, (struct sockaddr *)&stlocal, sizeof(stlocal));
if (iret == SOCKET_ERROR)
{
printf("Call bind failed. Error number: %d\t\n", WSAGetLastError());
exit(1);
}
//加入组播组,设置参数
stmrep.imr_multiaddr.s_addr = inet_addr(TEST_ADDR);
stmrep.imr_interface.s_addr = INADDR_ANY;
iret = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&stmrep, sizeof(stmrep));
if (iret == SOCKET_ERROR)
{
printf("Call setsockopt IP_ADD_MEMBERSHIP failed. Error number: %d\t\n",
WSAGetLastError());
exit(1);
}
//Set TTL to traverse up to multiple routers
itmp = TTL_VALUE;
iret = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&itmp, sizeof(int));
if (iret == SOCKET_ERROR)
{
printf("Call setsockopt IP_MULTICAST_TTL failed. Error number: %d\t\n",
WSAGetLastError());
exit(1);
}
//Disable loopback
itmp = FALSE;
iret = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&itmp, sizeof(int));
if (iret == SOCKET_ERROR)
{
printf("Call setsockopt IP_MULTICAST_LOOP failed. Error number: %d\t\n",
WSAGetLastError());
exit(1);
}
addr_size = sizeof(struct sockaddr_in);
for (i = 0; i < LOOPMAX; i++)
{
printf("Now receiving multicast message, address: %s\n", TEST_ADDR);
iret = recvfrom(s, achin, BUFSIZE, 0, (struct sockaddr *)&stfrom, &addr_size);
if (iret == SOCKET_ERROR)
{
printf("Call recvfrom failed. Error number: %d\t\n", WSAGetLastError());
exit(1);
}
//inet_ntoa(stFrom.sin_addr)函数将32位的IP地址转化成IP地址字符串
printf("Received from host: %s port: %d data: %s\n", inet_ntoa(stfrom.sin_addr),
ntohs(stfrom.sin_port), achin);
}

closesocket(s);
WSACleanup();

system("PAUSE");
return 0;
}
fisker0303 2005-06-06
  • 打赏
  • 举报
回复
windows网络编程 就有 网上有电子书可以下
max_xy 2005-06-06
  • 打赏
  • 举报
回复
TO:nuaawenlin(飘人)
if ((ret = recvfrom(sockM, recvbuf, BUFSIZE, 0,
(struct sockaddr *)&from, &len)) == SOCKET_ERROR
按照你给得代码我执行了一次,好像在上面那句话那里阻塞啊
nuaawenlin 2005-03-21
  • 打赏
  • 举报
回复
具体看《windows网络编程》第9章
nuaawenlin 2005-03-21
  • 打赏
  • 举报
回复
int main(int argc, char **argv)
{
WSADATA wsd;
struct sockaddr_in local,
remote,
from;
struct ip_mreq mcast;
SOCKET sockM;
TCHAR recvbuf[BUFSIZE],
sendbuf[BUFSIZE];
int len = sizeof(struct sockaddr_in),
optval,
ret;
DWORD i=0;

// Parse the command line and load Winsock
//
ValidateArgs(argc, argv);

if (WSAStartup(MAKEWORD(1, 1), &wsd) != 0)
{
printf("WSAStartup failed\n");
return -1;
}
// Create the socket. In Winsock 1 you don't need any special
// flags to indicate multicasting.
//
if ((sockM = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("socket failed with: %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
// Bind the socket to the local interface. This is done so
// that we can receive data.
//
local.sin_family = AF_INET;
local.sin_port = htons(iPort);
local.sin_addr.s_addr = dwInterface;

if (bind(sockM, (struct sockaddr *)&local,
sizeof(local)) == SOCKET_ERROR)
{
printf("bind failed with: %d\n", WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}

// Setup the im_req structure to indicate what group we want
// to join as well as the interface
//
remote.sin_family = AF_INET;
remote.sin_port = htons(iPort);
remote.sin_addr.s_addr = dwMulticastGroup;

mcast.imr_multiaddr.s_addr = dwMulticastGroup;
mcast.imr_interface.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;
}
// Set the TTL to something else. The default TTL is 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;
}
// Disable the loopback if selected. Note that on NT4 and Win95
// you cannot disable it.
//
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;
}
}

if (!bSender) // Receiver
{
// Receive some data
//
for(i = 0; i < dwCount; i++)
{
if ((ret = recvfrom(sockM, recvbuf, BUFSIZE, 0,
(struct sockaddr *)&from, &len)) == SOCKET_ERROR)
{
printf("recvfrom failed with: %d\n",
WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}
recvbuf[ret] = 0;
printf("RECV: '%s' from <%s>\n", recvbuf,
inet_ntoa(from.sin_addr));
}
}
else // Sender
{
// Send some data
//
for(i = 0; i < dwCount; i++)
{
sprintf(sendbuf, "server 1: This is a test: %d", i);
if (sendto(sockM, (char *)sendbuf, strlen(sendbuf), 0,
(struct sockaddr *)&remote,
sizeof(remote)) == SOCKET_ERROR)
{
printf("sendto failed with: %d\n",
WSAGetLastError());
closesocket(sockM);
WSACleanup();
return -1;
}
Sleep(500);
}
}
// Drop group membership
//
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);

WSACleanup();
return 0;
}
nuaawenlin 2005-03-21
  • 打赏
  • 举报
回复
// Module: Mcastws1.c
//
// Purpose:
// This sample illustrates IP multicasting using the Winsock 1
// method of joining and leaving an multicast group. This sample
// may be invoked as either a sender or a receiver. In both cases,
// the specified multicast group is joined.
//
// Compile:
// cl -o Mcastws1 Mcastws1.c Wsock32.lib
//
// Command Line Options/Parameters
// mcastws1.exe [-s] [-m:str] [-p:int] [-i:str] [-l] [-n:int]
// -s Act as sender; otherwise receive data
// -m:str Dotted decimal IP multicast address to join
// -p:int Port number to use
// -i:str Local interface to use
// -l Disable the loopback
// -n:int Number of messages to send or receive
//
#include <windows.h>
#include <winsock.h>

#include <stdio.h>
#include <stdlib.h>

#define MCASTADDR "234.5.6.7"
#define MCASTPORT 25000
#define BUFSIZE 1024
#define DEFAULT_COUNT 500

BOOL bSender = FALSE, // Act as sender?
bLoopBack = FALSE; // Disable loopback?

DWORD dwInterface, // Local interface to bind to
dwMulticastGroup, // Multicast group to join
dwCount; // Number of messages to send/receive

short iPort; // Port number to use

//
// Function: usage
//
// Description:
// Print usage information and exit
//
void usage(char *progname)
{
printf("usage: %s -s -m:str -p:int -i:str -l -n:int\n",
progname);
printf(" -s Act as server (send data); otherwise\n");
printf(" receive data.\n");
printf(" -m:str Dotted decimal multicast IP addres to join\n");
printf(" The default group is: %s\n", MCASTADDR);
printf(" -p:int Port number to use\n");
printf(" The default port is: %d\n", MCASTPORT);
printf(" -i:str Local interface to bind to; by default \n");
printf(" use INADDRY_ANY\n");
printf(" -l Disable loopback\n");
printf(" -n:int Number of messages to send/receive\n");
ExitProcess(-1);
}

//
// Function: ValidateArgs
//
// Description:
// Parse the command line arguments and set some global flags,
// depending on the values
//
void ValidateArgs(int argc, char **argv)
{
int i;

dwInterface = INADDR_ANY;
dwMulticastGroup = inet_addr(MCASTADDR);
iPort = MCASTPORT;
dwCount = DEFAULT_COUNT;

for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 's': // Sender
bSender = TRUE;
break;
case 'm': // Multicast group to join
if (strlen(argv[i]) > 3)
dwMulticastGroup = inet_addr(&argv[i][3]);
break;
case 'i': // Local interface to use
if (strlen(argv[i]) > 3)
dwInterface = inet_addr(&argv[i][3]);
break;
case 'p': // Port number to use
if (strlen(argv[i]) > 3)
iPort = atoi(&argv[i][3]);
break;
case 'l': // Disable loopback?
bLoopBack = TRUE;
break;
case 'n': // Number of messages to send/recv
dwCount = atoi(&argv[i][3]);
break;
default:
usage(argv[0]);
break;
}
}
}
return;
}

//
// Function: main
//
// Description:
// Parse the command line arguments, load the Winsock library,
// create a socket and join the multicast group. If this program
// is started as a sender then begin sending messages to the
// multicast group; otherwise, call recvfrom() to read messages
// sent to the group.
//
kingzai 2005-03-21
  • 打赏
  • 举报
回复
http://www.csdn.com.cn/program/4155.htm

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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