/* Listner1.cを動作していないとListner2.c * /私はコードの上から2つのプロセス...つまり listner1.exeとlistner2.exeを作成しているマルチキャスト
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <errno.h>
#include <Ws2tcpip.h>
#include <mswsock.h>
#define u_int32 UINT32
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define CPORT 12000
int main()
{
int iResult = 0;
WSADATA wsaData;
SOCKET RecvSocket;
struct sockaddr_in RecvAddr;
struct ip_mreq mreq;
char RecvBuf[1024];
int BufLen = 1024;
int yesopt = 1;
struct sockaddr_in SenderAddr;
int SenderAddrSize = sizeof (SenderAddr);
//-----------------------------------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"WSAStartup failed with error %d\n", iResult);
return 1;
}
//-----------------------------------------------
// Create a receiver socket to receive datagrams
RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (RecvSocket == INVALID_SOCKET) {
wprintf(L"socket failed with error %d\n", WSAGetLastError());
return 1;
}
//-----------------------------------------------
// Bind the socket to any address and the specified port.
if (setsockopt(RecvSocket,SOL_SOCKET, SO_REUSEADDR ,(char *) &yesopt ,sizeof(yesopt)) < 0) {
perror("Reusing ADDR failed");
exit(1);
}
memset(&RecvAddr,0,sizeof(RecvAddr));
RecvAddr.sin_family=AF_INET;
RecvAddr.sin_port=htons(CPORT);
RecvAddr.sin_addr.s_addr=inet_addr("192.168.0.104");
RecvBuf[0] = '\0';
mreq.imr_interface.s_addr = inet_addr("192.168.0.104");
mreq.imr_multiaddr.s_addr = inet_addr("235.0.0.0");
iResult = setsockopt(RecvSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq,sizeof(mreq));
if (iResult < 0) {
perror("membership");
exit(1);
}
iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
if (iResult != 0) {
wprintf(L"bind failed with error %d\n", WSAGetLastError());
return 1;
}
//-----------------------------------------------
// Call the recvfrom function to receive datagrams
// on the bound socket.
wprintf(L"Receiving datagrams...\n");
while(1) {
iResult = recvfrom(RecvSocket,
RecvBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, &SenderAddrSize);
if(iResult <= 0) break;
RecvBuf[iResult] = '\0';
if (iResult == SOCKET_ERROR) {
wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
break;
}
puts(RecvBuf);
}
//-----------------------------------------------
iResult = closesocket(RecvSocket);
if (iResult == SOCKET_ERROR) {
wprintf(L"closesocket failed with error %d\n", WSAGetLastError());
return 1;
}
//-----------------------------------------------
// Clean up and exit.
// wprintf(L"Exiting.\n");
WSACleanup();
return 0;
}
...
と私は 2つの異なるコマンドウィンドウでlistner1.exeとlistner2.exeを実行し、を実行すると...メッセージを送信するためのコード.. Sender.c
#include<io.h>
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<winsock2.h>
#include <errno.h>
#include <Ws2tcpip.h>
#include <mswsock.h>
#define u_int32 UINT32
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#define HELLO_PORT 12000
#define HELLO_GROUP "192.168.0.104"
main(int argc, char *argv[])
{
WSADATA wsa;
struct sockaddr_in addr;
int fd;
char message[2000];
int opt = 1;
int iResult = 0;
strcpy (message , argv[1]);
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Failed. Error Code : %d",WSAGetLastError());
return 1;
}
/* create what looks like an ordinary UDP socket */
if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
perror("socket");
exit(1);
}
/* set up destination address */
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("192.168.0.104");
addr.sin_port=htons(HELLO_PORT);
if (sendto(fd,message,strlen(message),0,(struct sockaddr *) &addr,
sizeof(addr)) < 0) {
perror("sendto");
exit(1);
}
}
を次Sender.exe "こんにちは" メッセージは単一のプロセスにのみ配信されます。 最初に起動するプロセス(たとえば、listner1.exeがlistner1.exeの前に開始されている場合は、すべてのメッセージがlistner2に送信されます) listner1.exeを終了して再起動し、listner1.exeをアクティブにしておくと、 new 。。メッセージだけlistner1.exeに配信されている
私はマルチキャストが起きていない理由を、見つけることができないのです
よろしく Sadanand
ありがとうございました...私は過去4時間苦労していました。乾杯! –