гм... чего-то у меня не получается..
есть демон-сервер, который отсылает обратно все, что ему приходит:
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#define PORT 666 // ???? ???????
#define sHELLO "Hello, %s [%s] Sailor\n"
int main(int argc, char* argv[]) {
    char buff[1024];
    printf("UDP DEMO echo-Server\n");
    // ??????????? ?????????? 
    if (WSAStartup(0x202,(WSADATA *) &buff[0])) {
        printf("WSAStartup error: %d\n",WSAGetLastError());
        return -1;
    }
    // ???????? ??????
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_DGRAM,0);
    if (my_sock==INVALID_SOCKET) {
        printf("Socket() error: %d\n",WSAGetLastError());
        WSACleanup();
        return -1;    
    }
    // ?????????? ?????? ? ????????? ??????? 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=INADDR_ANY;
    local_addr.sin_port=htons(PORT);
    if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr))) {
        printf("bind error: %d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
    }
    
    setsockopt(my_sock,SOL_SOCKET,SO_BROADCAST,&buff[0],sizeof(buff)-1); 
    // ????????? ???????, ?????????? ?????????
    while(1) {
        sockaddr_in client_addr;
        int client_addr_size = sizeof(client_addr);
        int bsize=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0,
        (sockaddr *) &client_addr, &client_addr_size);
        if (bsize==SOCKET_ERROR) {
            printf("recvfrom() error: %d\n",WSAGetLastError());
        }
        // ?????????? IP-????? ??????? ? ?????? ????????
        HOSTENT *hst;
        hst=gethostbyaddr((char *) &client_addr.sin_addr,4,AF_INET);
        printf("+%s [%s:%d] new DATAGRAM!\n",
            (hst)?hst->h_name:"Unknown host",
            inet_ntoa(client_addr.sin_addr),
            ntohs(client_addr.sin_port));
        // ????????? ??????????? ????
        buff[bsize]=0;
        // ????? ?? ????? 
        printf("C=>S:%s\n",&buff[0]);
        // ??????? ?????????? ???????
        sendto(my_sock,&buff[0],bsize,0,
        (sockaddr *)&client_addr, sizeof(client_addr));
    }
    return 1;
}
эта штука работает.
с другой стороны, есть клиент, котрый оттсылает все, что полчит из консольной строоки, потом деон ему это возвращает обратно и он это еще раз выводит на экран.
так же я создал еще один поток, в котором хочу рассылать широковещательные сообщения, получать их од демона и печатать.
но демон их не принимает...
наверное они не отсылаются?...
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include "functions.h"
#define PORT 666
#define SERVERADDR "127.0.0.1"
int main(int argc, char* argv[]) {
    char buff[10*1014];
    printf("UDP DEMO Client\nType quit to quit\n");
    // ???????????? ?????????? Winsocks
    if (WSAStartup(0x202,(WSADATA *)&buff[0])) {
    printf("WSAStartup error: %d\n",WSAGetLastError());
    return -1;
    }
    // ???????? ??????
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (my_sock==INVALID_SOCKET) {
    printf("socket() error: %d\n",WSAGetLastError());
    WSACleanup();
    return -1;
    }
    //????? ????????? ? ????????
    HOSTENT *hst;
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
    // ??????????? IP-?????? ????
    if (inet_addr(SERVERADDR)) {
        dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    { else {
        if (hst=gethostbyname(SERVERADDR)) {
            dest_addr.sin_addr.s_addr=((unsigned long **) hst->h_addr_list)[0][0];
        { else {
            printf("Unknown host: %d\n",WSAGetLastError());
            closesocket(my_sock);
            WSACleanup();
            return -1;
        }
    }
    
    struct ch1 data_ch1;
    data_ch1.my_sock = &my_sock;
    data_ch1.dest_addr = dest_addr;
    //////////////////
    
    SOCKET sock;
    char *buf="aaaaaaa"; 
    int bufsz=7;
    char len; 
    struct sockaddr_in sa; 
    sock=socket(PF_INET,SOCK_DGRAM,0); 
    sa.sin_family=AF_INET; 
    //sa.sin_addr.s_addr=htonl(0x0a000001); /* 10.0.0.1 */     
    sa.sin_addr.s_addr=inet_addr(SERVERADDR);
    sa.sin_port=htons(137); /* ;) */ 
    bind(sock,(struct sockaddr*)&sa,sizeof(sa)); /* ?????????? ?? ??????? ??????? ?????+???? */ 
    len=1; 
    setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&len,sizeof(len)); /* ???????? bc - ?????? ??? ???????????, ?.?. ethernet ?????? ???? ?????? ???? bc*/ 
    //sa.sin_addr.s_addr=htonl(0x0a0000ff); /* 10.0.0.255 */ 
    sa.sin_addr.s_addr=inet_addr("127.0.0.255");
    len=sizeof(sa); 
//    sendto(sock,buf,bufsz,0,(struct sockaddr*)&sa,sizeof(sa)); /* ???? ????? ??????? ??? ????? ? ???? 10.0.0.0/24 */ 
    struct ch1 dataDemon;
    dataDemon.my_sock = &sock;
    dataDemon.dest_addr = sa;
    //////////////////
    HANDLE hThreads[3]; 
    unsigned uThreadIDs[3]; 
    
    hThreads[1] = (HANDLE) _beginthreadex(NULL,0,sendData, &data_ch1,0,&uThreadIDs[1]); 
    hThreads[2] = (HANDLE) _beginthreadex(NULL,0,receiveData, &my_sock,0,&uThreadIDs[2]);
    
   
    hThreads[0] = (HANDLE) _beginthreadex(NULL,0,runDemon, &dataDemon,0,&uThreadIDs[0]);
   
    WaitForMultipleObjects(3, hThreads, TRUE, INFINITE );
    CloseHandle( hThreads[0] );
    CloseHandle( hThreads[1] );    
    CloseHandle( hThreads[2] );  
    // ??? ????????? - ?????
    closesocket(my_sock);
    closesocket(sock);
    WSACleanup();
    return 0;
}
функции : 
unsigned __stdcall receiveData (void * arg) {
    SOCKET * my_sock = (SOCKET *)arg;
    // ????? ????????? ? ???????
    char buff[10*1014];
    sockaddr_in server_addr;
    int server_addr_size=sizeof(server_addr);
    int n;
    sockaddr_in client_addr;
    int client_addr_size = sizeof(client_addr);
    
    HOSTENT *hst;
    while(1) {        
        n=recvfrom(*my_sock,&buff[0],sizeof(buff)-1,0,
            (sockaddr *) &server_addr, &server_addr_size);
/*        if (n==SOCKET_ERROR) {
            printf("recvfrom() error: %d\n",WSAGetLastError());
            closesocket(*my_sock);
            WSACleanup();
            break;
        }
*/      
        if (n != SOCKET_ERROR) {
            buff[n]=0;
            // ????? ????????? ? ??????? ????????? ?? ?????
            printf("S=>C:%s",&buff[0]);
            
        }
    } 
    _endthreadex( 0 );
    return 0;
}
unsigned __stdcall sendData(void * arg) {
    ch1 * data_ch1 = (ch1*)arg;
    while(1) {
        char buff[10*1014];
        // ?????? ????????? ? ??????????
        printf("S<=C:");fgets(&buff[0],sizeof(buff)-1,stdin);
        if (!strcmp(&buff[0],"quit\n")) {
            _endthreadex( 0 );
            return 0;
        }
        // ???????? ????????? ?? ??????
        sendto(*(data_ch1->my_sock), &buff[0], strlen(&buff[0]), 0,
            (sockaddr *) &(data_ch1->dest_addr), sizeof(data_ch1->dest_addr));
    }
    _endthreadex( 0 );
    return 0;
}
unsigned __stdcall runDemon(void * arg) {
    ch1 * data_ch1 = (ch1*)arg;
    char *buf="aaaaaaa"; 
    int bufsz=7;
    while(1) {
        sendto(*(data_ch1->my_sock),buf,bufsz,0,
            (sockaddr *) &(data_ch1->dest_addr), sizeof(data_ch1->dest_addr));
        //delay(3000);
    }
    _endthreadex( 0 );
    return 0;
}
и
struct ch1 {
    SOCKET * my_sock;
    sockaddr_in dest_addr;
};
вот...
я все же думаю, что я неправильно рассылаю широковещательные сообщения....
не так?..
p.s. я все это пытаюсь тестиить через localhost