2017-11-28 5 views
-1

UDPソケットプログラミング - 他のポートに5000
のsendto() - 1ポートからポートに6000 のrecvfrom()をリスニングクライアント - サーバーがポート5000でリッスン - 6000を同じクライアントに送信します。UDPソケットプログラミング - のrecvfrom()1ポートとのsendto()他のポート

Server.cは

#include <stdio.h>   /* for printf() and fprintf() */ 
#include <sys/socket.h>  /* for socket() and bind() */ 
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */ 
#include <stdlib.h>   /* for atoi() */ 
#include <string.h>   /* for memset() */ 
#include <unistd.h>   /* for close() */ 

#define MAXSIZE 255   /* Longest string */ 
#define SRC_PORT 5000 
#define DST_PORT 6000 

int main(int argc, char *argv[]) 
{ 
    int sock;        /* Socket */ 
    struct sockaddr_in ServAddr;  /* Local address */ 
    struct sockaddr_in ClntAddr;  /* Client address */ 
    socklen_t CliAddrLen;    /* Length of incoming message */ 
    char recBuffer[MAXSIZE];    /* Buffer for echo string */ 
    int recvMsgSize;      /* Size of received message */ 
    int i; 

    /* Create socket for sending/receiving datagrams */ 
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
     DieWithError("socket() failed"); 

    /* Construct local address structure */ 
    memset(&ServAddr, 0, sizeof(ServAddr));   /* Zero out structure */ 
    ServAddr.sin_family = AF_INET;      /* Internet address family */ 
    ServAddr.sin_addr.s_addr = htonl(INADDR_ANY);  /* Any incoming interface */ 
    ServAddr.sin_port = htons(SRC_PORT);   /* Local port */ 

    /* Construct address structure */ 
    memset(&ClntAddr, 0, sizeof(ClntAddr));   /* Zero out structure */ 
    ClntAddr.sin_family = AF_INET;      /* Internet address family */ 
    ClntAddr.sin_addr.s_addr = inet_addr("192.168.1.*");   
    ClntAddr.sin_port = htons(DST_PORT);    


    /* Bind to the local address */ 
    if (bind(sock, (struct sockaddr *) &ServAddr, sizeof(ServAddr)) < 0) 
     DieWithError("bind() failed"); 

    for (;;) /* Run forever */ 
    { 
     printf("Listening on UDP:5000 \n"); 
     /* Set the size of the in-out parameter */ 
     cliAddrLen = sizeof(ClntAddr); 

     /* Block until receive message from a client */ 
     if ((recvMsgSize = recvfrom(sock, recBuffer, MAXSIZE, 0,(struct sockaddr *) &ClntAddr, &cliAddrLen)) < 0) 
      DieWithError("recvfrom() failed") ; 

     printf("Handling Client: %s\n", inet_ntoa(ClntAddr.sin_addr)); 



      printf("Received Data: %s",recBuffer); 
     printf("\n"); 

     /* Send response datagram back to the client */ 


     if (sendto(sock, recBuffer, MAXSIZE, 0, (struct sockaddr *) & ClntAddr, sizeof(ClntAddr)) < 0) 
      DieWithError("sendto() failed"); 

    } 
    /* NOT REACHED */ 
} 

それは完璧に動作します。データを送受信するために異なるポートを使用するクライアントおよびサーバープログラミング。 が、これは間違った

lntAddr.sin_addr.s_addr = inet_addr("CLIENT_IP"); 

inet_addrであるあなたに よろしく

+3

ないホスト名点線のIPアドレスを取得します。 – dbush

+1

クライアントのコードはどこですか? – dbush

+1

@dbushああ、それは一点で停止します.. –

答えて

0

ありがとうございましたあなたの `DieWithError`関数は無限再帰を持って

+0

'recvfrom'が呼び出されたときに' ClntAddr'の内容が上書きされるので、この部分は実際には関係ありません。 – dbush

関連する問題