2017-02-18 7 views
-2

私が現在取り組んでいるプロジェクトでは、クライアントがUDPを介してサーバーに接続し、その後にサーバーを使用してピア間にトークンリングネットワークを確立する必要があります。サーバーは各クライアント/ピアのIPとポートを収集し、アレイに格納します。これらの配列の要素は、ネットワークを介してサーバーによってピアに送り返されます。ピアは、この情報を使用して、サーバーではなく相互に接続します。ピア間でメッセージの送受信に問題があります。私はprintステートメントを使って、アドレス構造に正しいポートとアドレスが含まれていると判断できました。私はバッファの問題や何らかのタイミング問題を扱っているかもしれません。私は自分のコードを何回か再構成してしまい、動作させることができないようです。この時点でのヒントは非常に高く評価されます。UDPソケットをバインドする際の問題

wiresharkを使用して、メッセージが実際にネットワーク経由で送信されたと判断できました。プログラムはwhileループで次の関数で停止します。ただし、メッセージが受信されない

//Thread function to check for messages on the socket 
void receiveMessages(int socket) { 
    long int nBytes = -1; 
    char buffer[BUFFERSIZE]; 

    //Wait to receive message from other peers 
    while (nBytes <= 0) { 
     nBytes = recvfrom(socket, buffer, BUFFERSIZE, 0, NULL, NULL); 
    } 

    //Print the message received 
    printf("%s", buffer); 
} 

メインプログラム

// 
// runPeer.c 
// tokenRing 
// 
// Created by Bryce Hagar on 2/13/17. 
// Copyright © 2017 Bryce Hagar. All rights reserved. 
// 

#include <stdio.h> 
#include "bbpeer.h" 

int main(int argc, const char * argv[]){ 
    //Used for creating the Client-Server socket 
    int clientSocket; 

    //Create a local peer 
    Host localPeer = createHost(true, true); 
    //Get user information; update local peer 
    getUserInfo(localPeer, argc, argv); 
    //Configure socket structure with local peer info 
    configSockStruct(localPeer, INADDR_ANY, localPort); 

    //Create a remote server 
    Host remoteServer = createHost(false, false); 
    //Configure socket structure with remote server info 
    configSockStruct(remoteServer, remoteIP, remotePort); 

    //Create a socket bound to the local peer 
    clientSocket = createSocket(localPeer); 

    //Announce peer's existence to server and receive acceptance 
    announceToServer(localPeer, remoteServer, clientSocket); 

    //Create new remote peer host structure 
    Host remotePeer = getPeerInfo(clientSocket); 
    freeHost(remoteServer); 

    //Send messages to peers 
    sendMessageToPeer(clientSocket, remotePeer, localPeer); 

    //Receive messages from other peers 
    receiveMessages(clientSocket); 

    return 0; 
} 

ピアADT

// 
// bbpeer.c 
// bbpeer 
// 
// Created by Bryce Hagar on 2/16/17. 
// Copyright © 2017 Bryce Hagar. All rights reserved. 
// 

#include "bbpeer.h" 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <arpa/inet.h> 
#include <pthread.h> 


#define  BUFFERSIZE  1024 
#define  ACCEPTED  "accepted" 
#define  NEW    "new" 
#define  TEST   "test" 

int localPort, remotePort; //User input globals 
const char * remoteIP; 
pthread_t newThread; 

/* Get user input from command line */ 
void getUserInfo(Host localPeer, int argc, const char *argv[]) { 
    int j = 1; 

    //Error check for input issues 
    if (!localPeer->isPeer) { 
     printf("User input is only applicable for peers.\n"); 
     exit(EXIT_FAILURE); 
    } 

    //Get user input from command line 
    if (argc == 6) { 
     //Connecting to new token ring (server), 
     if (!strcmp(argv[1],"-new")) { 
      localPeer->newRing = true; 
      j++; 
     } 
    } 

    //Assign arguments to global variables 
    localPort = atoi(argv[j++]); 
    remoteIP = argv[j++]; 
    remotePort = atoi(argv[j]); 
} 

//Send announcement to server, and wait for acknoledgement 
void announceToServer(Host localPeer, Host remoteServer, int clientSocket) { 
    long int nBytes; //Used to send messages 
    char buffer[BUFFERSIZE]; 

    while(!localPeer->accepted){ 

     //Announce new peer message to server 
     memset(buffer, 0, BUFFERSIZE); 
     strcpy(buffer, NEW); 
     nBytes = strlen(buffer) + 1; 

     //Send message to server 
     sendto(clientSocket,buffer,nBytes,0,(struct sockaddr *)&remoteServer->sockAddr, 
       remoteServer->addr_size); 

     //Receive message from server 
     nBytes = recvfrom(clientSocket,buffer,BUFFERSIZE,0,NULL, NULL); 

     //If accepted, set flag 
     if (!strcmp(buffer, ACCEPTED)) { 
      localPeer->accepted = true; 
      printf("ACCEPTED BY SERVER\n");//(debug) 
     } 
    } 
} 

//Get info from server message to peers 
Host getPeerInfo(int clientSocket) { 
    long int numBytes = -1; 
    int port; 
    char buffer[BUFFERSIZE]; 
    char *ip; 

    //Clear buffer, wait for message from server 
    memset(buffer, 0, BUFFERSIZE); 
    while (numBytes <= 0) { 
     numBytes = recvfrom(clientSocket, buffer, BUFFERSIZE, 0, NULL, NULL); 
    } 

    //Tokenize the message into ip and port 
    ip = strtok(buffer, "\n"); 
    port = atoi(strtok(NULL, "\n")); 

    //Create a new host struct for the remote peer 
    Host remotePeer = createHost(true, false); 
    //Configure the socket structure for the new remote peer 
    configSockStruct(remotePeer, ip, port); 

    return remotePeer; 
} 

////////////////////////// Possible Error ////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////// 
/////////// //////////////////////////////////////////////////////////////////////// 
//Send message to remote peer from local peer 
void sendMessageToPeer(int p2pSocket, Host remotePeer, Host localPeer) { 
    long int nBytes; 
    char buffer[BUFFERSIZE]; 
    bzero(buffer, BUFFERSIZE); 
    strcpy(buffer, TEST); 

    //Send "test" message 
    nBytes = strlen(buffer)+1; 

    //Send message to the socket(debug) 
     sendto(p2pSocket,buffer,nBytes,0,(struct sockaddr *)&remotePeer->sockAddr, 
      remotePeer->addr_size); 
    //Print the ip and port stored in the remote peer host (debug) 
    printf("%s:%d\n", inet_ntoa(remotePeer->sockAddr.sin_addr), 
      ntohs(remotePeer->sockAddr.sin_port)); 
} 

//Thread function to check for messages on the socket 
void receiveMessages(int socket) { 
    long int nBytes = -1; 
    char buffer[BUFFERSIZE]; 

    //Wait to receive message from other peers 
    while (nBytes <= 0) { 
     nBytes = recvfrom(socket, buffer, BUFFERSIZE, 0, NULL, NULL); 
    } 

    //Print the message received 
    printf("%s", buffer); 
} 

//////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////// 
////////////////////////// Possible Error ////////////////////////////////////// 

ホストADT

// 
// host.c 
// bbserver 
// 
// Created by Bryce Hagar on 2/17/17. 
// Copyright © 2017 Bryce Hagar. All rights reserved. 
// 

#include "host.h" 

/* Allocate memory for new host struct, 
assigns variables for peers and servers*/ 
Host createHost(bool isPeer, bool isLocal) { 
    Host newHost = malloc(sizeof(*newHost)); 
    newHost->addr_size = sizeof newHost->sockAddr; 
    newHost->isPeer = isPeer; 
    newHost->isLocal = isLocal; 
    if (isPeer) { 
     newHost->newRing = false; 
     newHost->hasToken = false; 
     newHost->accepted = false; 
    } 
    return newHost; 
} 

void freeHost(Host thisHost) { 
    free(thisHost); 
} 

/* Configure socket structure */ 
void configSockStruct(Host thisHost, const char *ip, int port) { 

    memset((void *) &thisHost->sockAddr, 0, (size_t)sizeof(thisHost->sockAddr)); 
    thisHost->sockAddr.sin_family = AF_INET; 
    memset(thisHost->sockAddr.sin_zero, '\0', sizeof thisHost-> 
     sockAddr.sin_zero); 
    thisHost->sockAddr.sin_port = htons(port); 

    if (!thisHost->isLocal) { 
     //Get address from functions parameters 
     struct hostent *hostptr = gethostbyname(ip); 
     memcpy((void *)&thisHost->sockAddr.sin_addr, 
      (void *)hostptr->h_addr, hostptr->h_length); 
    } 
    else { 
     thisHost->sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    } 
} 

int createSocket(Host thisHost) { 
    //Create UDP socket 
    int newSocket = socket(AF_INET, SOCK_DGRAM, 0); 
    bind(newSocket, (struct sockaddr *)&thisHost->sockAddr, 
     sizeof(thisHost->sockAddr)); 
    return newSocket; 
} 
+0

なぜ 'recvfrom()'エラーを無視してループしていますか?発生時にエラーをログに記録しない限り、デバッグは単なる推測ゲームです。このようなコードは書かないでください。 – EJP

答えて

0

無駄の時間で私の問題を絞り込んした後、トロー私のコンピュータ(Mac)が私のプログラムがメッセージを受け取っていないことがわかった。このプログラムは、大学のSSHサーバーで初めて試みました。この時点までに、私はClient-ServerプログラムのServerとしてsshサーバを使用し、クライアント(ピア)をローカルに作成しました。両方のサーバーで試した後、初めての作業でした。

関連する問題