2011-07-22 24 views
3

イムこのようにソケットを介してネットワーク上でデータを送信する:(ブロードキャスト)送信/受信奇妙データ

void sendBroad(char *dstIP, char *localIP, char *localMAC) 
{ 
    int sock;       /* Socket */ 
    struct sockaddr_in broadcastAddr; /* Broadcast address */ 
    int broadcastPermission;   /* Socket opt to set permission to broadcast */ 
    unsigned int dataLen; 
    char data[100]={0}; 

    strcat(data, localIP); 
    strcat(data, " "); 
    strcat(data, localMAC); 
    strcat(data, " "); 


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

    /* Set socket to allow broadcast */ 
    broadcastPermission = 1; 
    if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission, 
      sizeof(broadcastPermission)) < 0) 
     perror("setsockopt() failed"); 

    /* Construct local address structure */ 
    memset(&broadcastAddr, 0, sizeof(broadcastAddr)); /* Zero out structure */ 
    broadcastAddr.sin_family = AF_INET;     /* Internet address family */ 
    broadcastAddr.sin_addr.s_addr = inet_addr(dstIP); /* Broadcast IP address */ 
    broadcastAddr.sin_port = htons(BroadcastPort);  /* Broadcast port */ 


    dataLen = strlen(data); 
    int j; 
    for (j=0; j<1; j++) /* 3krat a dost */ 
    { 
     /* Broadcast localIP in datagram to clients */ 
     if (sendto(sock, data, dataLen, 0, (struct sockaddr *) 
       &broadcastAddr, sizeof(broadcastAddr)) != dataLen) 
      perror("sendto() sent a different number of bytes than expected"); 
    } 
    /* NOT REACHED */ 
} 

が、同様に、受信したときに私はいつも初めにいくつかの奇妙な文字を取得:

X.?192.168..... 

私がこのデータを6回送信しようとすると、192 ...で始まるデータが得られれば、他の5つの文字列はそれらの奇妙な文字で始まります。どのようなアイデアがここで起こっている?

おかげ

+2

downvote、どれくらいクールだ... – shaggy

+2

あなたはネットワーキングに関連するものとしてあなたの質問をタグ付けしていると思いますが、それは実際には何も関係がありません。あなたの**問題**は文字列です操作、およびネットワーキングは、単に文字列を操作する最終目標です。 –

+4

彼は問題が何であったか、したがって質問とタグを知らなかった。 – Erix

答えて

7

char data[100];が初期化されていません。したがって、空の文字列の最後ではなく、未定義のガベージの末尾に連結します。 '\ 0'が予約された空間のどこにでも出現することは保証されていないので、これは明らかに未定義の動作です(これは未定義の単純な動作であり、コンパイラはこれを検出したときに/ )。

char data[100] = {0};は、このトリックを行う必要があります。

+0

私はそれがうまくいきたいですが、それは同じ問題ではありません – shaggy

+0

おそらく周辺のコードをもっと見せてください。 –

+0

コードで更新された質問 – shaggy

関連する問題