2016-03-25 18 views
1

/* 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

答えて

0

をご使用のサーバでは、マルチキャストアドレスに話をする必要があります。

/* set up destination address */ 
    memset(&addr,0,sizeof(addr)); 
    addr.sin_family=AF_INET; 
    addr.sin_addr.s_addr=inet_addr("235.0.0.0"); 
    addr.sin_port=htons(HELLO_PORT); 

     if (sendto(fd,message,strlen(message),0,(struct sockaddr *) &addr, 
      sizeof(addr)) < 0) { 
      perror("sendto"); 
      exit(1); 
     } 

さらに、私のコンピュータのリスナーでは、リスナーを動作させるためにマルチキャストメンバーシップの前にバインドを行いました。

+0

ありがとうございました...私は過去4時間苦労していました。乾杯! –

関連する問題