Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1

    [WinSock] ! Làm thế nào để server gửi dữ liệu tới địa chỉ BroadCast

    Chào các bạn.
    Mình nghe nói khi dùng giao thức UDP gửi tới 1 địa chỉ BroadCast thì tất cả các host khác trong mạng sẽ nhận được gói tin này.
    Mình code chương trình server thì lúc gửi bị lỗi .
    Mình mong được các bạn debug và chỉ lỗi giùm . Mình xin cảm ơn [IMG]images/smilies/smile.png[/IMG]


    Mã:
    #include "stdafx.h"//////////////////////////////////////////////////////////////////////////using namespace std; #define MYPORT 27015 //////////////////////////////////////////////////////////////////////////VOID StartServer(){     WSAData wSock;     if ( WSAStartup(MAKEWORD(2,2),&wSock) )        return ;     SOCKET ServerSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);     sockaddr_in sock;    ZeroMemory(&sock,sizeof(sock));    sock.sin_family = AF_INET;    sock.sin_port = htons(MYPORT);    sock.sin_addr.s_addr = INADDR_ANY;           BOOL bPer = true;         //////////////////////////////////////////////////////////////////////////    int iBind = bind(ServerSocket,(sockaddr*)&sock,sizeof(sock));    cout << "
     iBind: " << iBind;       cout << "
     SetSock: " << setsockopt(ServerSocket,SOL_SOCKET,SO_BROADCAST,(char*)&bPer,sizeof(BOOL));    CHAR szSend[MAX_PATH+1];    int iMessage = 0 , iResult; //////////////////////////////////////////////////////////////////////////    // BroadCast    sockaddr_in sockClient;    ZeroMemory(&sockClient,sizeof(sockClient));    sock.sin_family = AF_INET;    sock.sin_port = htons(MYPORT);    sock.sin_addr.s_addr = inet_addr("255.255.255.255");         while(true){          getch();        iMessage++;        wsprintf(szSend,"Message #%d",iMessage);        // send thu toi dia chi broad cast        iResult = sendto(ServerSocket,szSend,strlen(szSend),0,(sockaddr*)&sockClient,sizeof(sockClient));        cout << "
     Send: " << iResult << " Kbs";        cout << "
     ------------------------------------- 
    
    ";        ZeroMemory(szSend,MAX_PATH);         if ( iResult == -1 ){             cout << "
     Error: " << WSAGetLastError();        }     }     closesocket(ServerSocket);    WSACleanup();} //////////////////////////////////////////////////////////////////////////int _tmain(int argc, _TCHAR* argv[]){     StartServer();    getch();    return 0;}

  2. #2
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Trích dẫn Gửi bởi tucute89
    Chào các bạn.
    Mình nghe nói khi dùng giao thức UDP gửi tới 1 địa chỉ BroadCast thì tất cả các host khác trong mạng sẽ nhận được gói tin này.
    Mình code chương trình server thì lúc gửi bị lỗi .
    Mình mong được các bạn debug và chỉ lỗi giùm . Mình xin cảm ơn [IMG]images/smilies/smile.png[/IMG]


    Mã:
    #include "stdafx.h"//////////////////////////////////////////////////////////////////////////using namespace std; #define MYPORT 27015 //////////////////////////////////////////////////////////////////////////VOID StartServer(){     WSAData wSock;     if ( WSAStartup(MAKEWORD(2,2),&wSock) )        return ;     SOCKET ServerSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);     sockaddr_in sock;    ZeroMemory(&sock,sizeof(sock));    sock.sin_family = AF_INET;    sock.sin_port = htons(MYPORT);    sock.sin_addr.s_addr = INADDR_ANY;           BOOL bPer = true;         //////////////////////////////////////////////////////////////////////////    int iBind = bind(ServerSocket,(sockaddr*)&sock,sizeof(sock));    cout << "
     iBind: " << iBind;       cout << "
     SetSock: " << setsockopt(ServerSocket,SOL_SOCKET,SO_BROADCAST,(char*)&bPer,sizeof(BOOL));    CHAR szSend[MAX_PATH+1];    int iMessage = 0 , iResult; //////////////////////////////////////////////////////////////////////////    // BroadCast    sockaddr_in sockClient;    ZeroMemory(&sockClient,sizeof(sockClient));    sock.sin_family = AF_INET;    sock.sin_port = htons(MYPORT);    sock.sin_addr.s_addr = inet_addr("255.255.255.255");         while(true){          getch();        iMessage++;        wsprintf(szSend,"Message #%d",iMessage);        // send thu toi dia chi broad cast        iResult = sendto(ServerSocket,szSend,strlen(szSend),0,(sockaddr*)&sockClient,sizeof(sockClient));        cout << "
     Send: " << iResult << " Kbs";        cout << "
     ------------------------------------- 
    
    ";        ZeroMemory(szSend,MAX_PATH);         if ( iResult == -1 ){             cout << "
     Error: " << WSAGetLastError();        }     }     closesocket(ServerSocket);    WSACleanup();} //////////////////////////////////////////////////////////////////////////int _tmain(int argc, _TCHAR* argv[]){     StartServer();    getch();    return 0;}
    Gỉa sử bạn đã khai báo thư viện đầy đủ.
    Thì mình thấy lỗi sau.

    Mã:
    //////////////////////////////////////////////////////////////////////////
        // BroadCast
        sockaddr_in sockClient;
        ZeroMemory(&sockClient,sizeof(sockClient));
        sock.sin_family = AF_INET;
        sock.sin_port = htons(MYPORT);
        sock.sin_addr.s_addr = inet_addr("255.255.255.255");
       
        while(true){
    
    
            getch();
            iMessage++;
            wsprintf(szSend,"Message #%d",iMessage);
            // send thu toi dia chi broad cast
            iResult = sendto(ServerSocket,szSend,strlen(szSend),0,(sockaddr*)&sockClient,sizeof(sockClient));  ///Đoạn này nè
    đầu tiên bạn ZeroMemory của sockClient .
    và khỏi tạo sock là địa chỉ broadcast,nhưng khi send thì bạn lại send tới sockClient - mà sockClient đã zeromemory rồi.
    Đúng ra fải send tới sock chứ.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thank Tauit tối qua buồn ngủ quá code nhầm ( + cái VassitX nó đẻ code nhầm [IMG]images/smilies/biggrin.png[/IMG]
    Chúc tau 1 ngày tốt lành :X

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •