---
# System prepended metadata

title: 網路程式設計 HW12 廣播網路程式作業

---

# 網路程式設計 HW12 廣播網路程式作業

學生: 1084837廖經翰

如果pdf跑版的話可以前往hackmd網頁: https://hackmd.io/@LiaoJingHan/BJLQCFeI3

## 練習2. server同時傳送多種資料

這次的作業練習2是利用UDP的廣播功能來讓server廣播訊息給client，server一次會廣播3個訊息，也就是數字、小寫英文、大寫英文，廣播出去之後client會收到這三個訊息並且輸出訊息內容

( 可以開啟多個server廣播，但是client只能開啟一個 )

執行畫面:

<center><img style="margin-top:auto;border:1px #eee;width:˙0%;" src="https://hackmd.io/_uploads/rJJD89lL3.png" /></center>

<center>server</center>

<br>

<center><img style="margin-top:auto;border:1px #eee;width:70%;" src="https://hackmd.io/_uploads/r1yOL9lLn.png" /></center>

<center>client</center>

<br>

server程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 20
#define BraodcastPort 5678  //廣播傳送的port

int main()
{
	struct sockaddr_in serv , clnt;

	int i = 1 , n;

	char str[MAXLINE];

    //set WSA and initial WSAStartup
	SOCKET serv_sd;
	WSADATA wsadata;

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , &wsadata );

	//使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

    //開啟廣播的參數
	BOOL broadcast = TRUE;

    //設定廣播
	setsockopt( serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast) );

	int clnt_len = sizeof( clnt );

	printf( "server start broadcasting on port: %d\n" , BraodcastPort );

    //設定client的結構
	clnt.sin_addr.s_addr = inet_addr( "255.255.255.255" );
	clnt.sin_family = AF_INET;
	clnt.sin_port = htons( BraodcastPort );

	while( 1 )
    {
        //顯示數字
        memset( str , i % 10 + '0' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //顯示小寫英文
        memset( str , (i-1) % 26 + 'a' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //顯示大寫英文
        memset( str , (i-1) % 26 + 'A' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //緩衝時間1秒
        Sleep( 1000 );

        i++;
    }

    //關閉socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system("pause");
}
```

client程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 1024
#define BraodcastPort 5678  //廣播傳送的port

int main()
{
    //set WSA and initial WSAStartup
	SOCKET serv_sd;
	WSADATA wsadata;

    struct sockaddr_in serv , clnt;

	int n;

	char str[MAXLINE];

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , &wsadata );

    //使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

	//開啟廣播的參數
	BOOL broadcast = TRUE;

	//設定廣播
	if( setsockopt(serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast)) < 0 )
    {
        printf( "setsockopt() error !\n" );
    }

    //設定client的結構
	clnt.sin_addr.s_addr = 0;  //0表示使用電腦自己的IP
	clnt.sin_family = AF_INET;
	clnt.sin_port = htons( BraodcastPort );

	//綁定client結構裡設定的資訊
	if( bind(serv_sd , (LPSOCKADDR) &clnt , sizeof(clnt)) < 0 )
    {
        printf( "bind() error !\n" );

        system( "pause" );

        return 0;
    }

    int serv_len = sizeof( serv );

    while( 1 )
    {
        //接收server傳送過來的訊息
        n = recvfrom( serv_sd , str , MAXLINE , 0 , (LPSOCKADDR) &serv , &serv_len );

        printf( "client (from: %s): %s\n" , inet_ntoa(serv.sin_addr) , str );
    }

    //關閉TCP socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system( "pause" );
}
```

## 練習3. client過濾接收的資料

作業練習3是利用UDP的廣播功能來讓server廣播訊息給client，server一次會廣播3個訊息，也就是數字、小寫英文、大寫英文，廣播出去之後client會收到這三個訊息並且會去過濾接收到的資料，3個訊息表示3個channel，也就是數字表示channel1，小寫英文表示channel2，大寫英文表示channel3，client可以輸入1~3來選擇channel number，當輸入完channel number之後client就會去過濾接收過來的資料，所以只會顯示該channel的訊息內容，該channel的訊息內容顯示10次之後，client才可以重新選擇channel

( 可以開啟多個server廣播，但是client只能開啟一個 )

執行畫面:

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/Skudt5lUh.png" /></center>

<center>server</center>

<br>

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/rkZ5tce8h.png" /></center>

<center>client</center>

<br>

server程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 20
#define BraodcastPort 5678  //廣播傳送的port

int main()
{
	struct sockaddr_in serv , clnt;

	int i = 1 , n;

	char str[MAXLINE];

    //set WSA and initial WSAStartup
	SOCKET serv_sd;
	WSADATA wsadata;

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , &wsadata );

	//使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

    //開啟廣播的參數
	BOOL broadcast = TRUE;

    //設定廣播
	setsockopt( serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast) );

	int clnt_len = sizeof( clnt );

	printf( "server start broadcasting on port: %d\n" , BraodcastPort );

    //設定client的結構
	clnt.sin_addr.s_addr = inet_addr( "255.255.255.255" );
	clnt.sin_family = AF_INET;
	clnt.sin_port = htons( BraodcastPort );

	while( 1 )
    {
        //顯示數字
        memset( str , i % 10 + '0' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //顯示小寫英文
        memset( str , (i-1) % 26 + 'a' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //顯示大寫英文
        memset( str , (i-1) % 26 + 'A' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //緩衝時間1秒
        Sleep( 1000 );

        i++;
    }

    //關閉socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system("pause");
}
```

client程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 1024
#define BraodcastPort 5678  //廣播傳送的port

int main()
{
    //set WSA and initial WSAStartup
	SOCKET serv_sd;
	WSADATA wsadata;

    struct sockaddr_in serv , clnt;

	int n , channel = 0;

	char str[MAXLINE];

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , &wsadata );

    //使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

	//開啟廣播的參數
	BOOL broadcast = TRUE;

	//設定廣播
	if( setsockopt(serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast)) < 0 )
    {
        printf( "setsockopt() error !\n" );
    }

    //設定client的結構
	clnt.sin_addr.s_addr = 0;  //0表示使用電腦自己的IP
	clnt.sin_family = AF_INET;
	clnt.sin_port = htons( BraodcastPort );

	//綁定client結構裡設定的資訊
	if( bind(serv_sd , (LPSOCKADDR) &clnt , sizeof(clnt)) < 0 )
    {
        printf( "bind() error !\n" );

        system( "pause" );

        return 0;
    }

    int serv_len = sizeof( serv );

    while( 1 )
    {
        printf( "input the channel number (1~3): " );

        scanf( "%d" , &channel );

        printf( "\n" );

        for( int i = 0 ; i < 30 ; i++ )
        {
            //接收server傳送過來的訊息
            n = recvfrom( serv_sd , str , MAXLINE , 0 , (LPSOCKADDR) &serv , &serv_len );

            if( channel == 1 )  //只接收數字訊息
            {
                if( str[0] >= '0' && str[0] <= '9' )
                {
                    printf( "client (from: %s): %s\n" , inet_ntoa(serv.sin_addr) , str );
                }
            }
            else if( channel == 2 )  //只接收小寫英文訊息
            {
                if( str[0] >= 'a' && str[0] <= 'z' )
                {
                    printf( "client (from: %s): %s\n" , inet_ntoa(serv.sin_addr) , str );
                }
            }
            else if( channel == 3 )  //只接收大寫英文訊息
            {
                if( str[0] >= 'A' && str[0] <= 'Z' )
                {
                    printf( "client (from: %s): %s\n" , inet_ntoa(serv.sin_addr) , str );
                }
            }
        }

        printf( "\n" );
    }

    //關閉TCP socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system( "pause" );
}
```

## 練習4. client使用thread作出選台效果

作業練習4是利用UDP的廣播功能來讓server廣播訊息給使用thread的client，server一次會廣播3個訊息，也就是數字、小寫英文、大寫英文，廣播出去之後client會收到這三個訊息並且會去過濾接收到的資料，3個訊息表示3個channel，也就是數字表示channel1，小寫英文表示channel2，大寫英文表示channel3，client可以輸入1~3來選擇channel number，當輸入完channel number之後client就會去過濾接收過來的資料，所以只會顯示該channel的訊息內容，client會建立一個thread，client的main主要負責處理切換頻道的部分，讓client可以選擇想要的頻道來達到過濾資料的效果，client的thread主要負責接收server傳送過來的訊息並且輸出訊息內容，因為有thread幫忙，這樣client就可以隨時切換頻道不會被限制


( 可以開啟多個server廣播，但是client只能開啟一個 )

執行畫面:

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/r19FA5eI3.png" /></center>

<center>server</center>

<br>

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/BJRq0cx83.png" /></center>

<center>client</center>

<br>

server程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 20
#define BraodcastPort 5678  //廣播傳送的port

int main()
{
	struct sockaddr_in serv , clnt;

	int i = 1 , n;

	char str[MAXLINE];

    //set WSA and initial WSAStartup
	SOCKET serv_sd;
	WSADATA wsadata;

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , &wsadata );

	//使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

    //開啟廣播的參數
	BOOL broadcast = TRUE;

    //設定廣播
	setsockopt( serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast) );

	int clnt_len = sizeof( clnt );

	printf( "server start broadcasting on port: %d\n" , BraodcastPort );

    //設定client的結構
	clnt.sin_addr.s_addr = inet_addr( "255.255.255.255" );
	clnt.sin_family = AF_INET;
	clnt.sin_port = htons( BraodcastPort );

	while( 1 )
    {
        //顯示數字
        memset( str , i % 10 + '0' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //顯示小寫英文
        memset( str , (i-1) % 26 + 'a' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //顯示大寫英文
        memset( str , (i-1) % 26 + 'A' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "server broadcast: %s\n" , str );

        //緩衝時間1秒
        Sleep( 1000 );

        i++;
    }

    //關閉socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system("pause");
}
```

client程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 1024
#define BraodcastPort 5678  //廣播傳送的port

//global variable
SOCKET serv_sd;  //set WSA and initial WSAStartup

char str[MAXLINE];
struct sockaddr_in clnt;
int n , channel = 0;

//負責接收server傳送過來的訊息並且輸出訊息內容
void *recv_messg( void *argu )
{
    while( 1 )
    {
        int clnt_len = sizeof( clnt );

        //接收server傳送過來的訊息
        n = recvfrom( serv_sd , str , MAXLINE , 0 , (LPSOCKADDR) &clnt , &clnt_len );

        if( channel == 1 )  //只接收數字訊息
        {
            if( str[0] >= '0' && str[0] <= '9' )
            {
                printf( "client (from: %s): %s\n" , inet_ntoa(clnt.sin_addr) , str );
            }
        }
        else if( channel == 2 )  //只接收小寫英文訊息
        {
            if( str[0] >= 'a' && str[0] <= 'z' )
            {
                printf( "client (from: %s): %s\n" , inet_ntoa(clnt.sin_addr) , str );
            }
        }
        else if( channel == 3 )  //只接收大寫英文訊息
        {
            if( str[0] >= 'A' && str[0] <= 'Z' )
            {
                printf( "client (from: %s): %s\n" , inet_ntoa(clnt.sin_addr) , str );
            }
        }
    }
}

int main()
{
    //set WSA and initial WSAStartup
	WSADATA wsadata;

    struct sockaddr_in serv;

	int n , i , j , total = 0 , thread_id = 0;

	char str[MAXLINE];

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , (LPWSADATA) &wsadata );

    //使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

	//開啟廣播的參數
	BOOL broadcast = TRUE;

	//設定廣播
	if( setsockopt(serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast)) < 0 )
    {
        printf( "setsockopt() error !\n" );
    }

    //設定server的結構
	serv.sin_addr.s_addr = 0;  //0表示使用電腦自己的IP
	serv.sin_family = AF_INET;
	serv.sin_port = htons( BraodcastPort );

	//綁定client結構裡設定的資訊
	if( bind(serv_sd , (LPSOCKADDR) &serv , sizeof(serv)) < 0 )
    {
        printf( "bind() error !\n" );

        system( "pause" );

        return 0;
    }

    int serv_len = sizeof( serv );

    //建立一個thread來接收server傳送過來的訊息
    CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE) recv_messg , NULL , 0 , (LPDWORD) &thread_id );

    //負責處理切換頻道的部分
    while( 1 )
    {
        scanf( "%d" , &channel );

        printf( "switch to channel %d\n" , channel );

        printf( "\n" );
    }

    //關閉TCP socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system( "pause" );
}
```

## 練習5. 用不同port實現頻道與選台

作業練習5是利用UDP的廣播功能來讓server廣播訊息給使用thread的client，server一次會廣播3個訊息，也就是數字、小寫英文、大寫英文，廣播出去之後client會收到這三個訊息並且會去過濾接收到的資料，3個訊息表示3個channel，3個channel都有各自不同的port，也就是數字表示port為5678的channel1，小寫英文表示port為5679的channel2，大寫英文表示port為5680的channel3

一開始client會先到預設的port為5678的channel1，之後client可以輸入1~3來選擇channel number，當輸入完channel number之後，client就會去重新設定與綁定UDP協定的參數，這樣才能切換port來達到過濾資料的功能，當client切換port之後，client只會顯示該port的channel之訊息內容，因為有thread幫忙，這樣client就可以隨時切換頻道不會被限制

( 可以開啟多個server廣播，但是client只能開啟一個 )

執行畫面:

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/HJJQzigIh.png" /></center>

<center>server</center>

<br>

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/SkqQMseI2.png" /></center>

<center>client</center>

<br>

server程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 20
#define BraodcastPort 5678  //廣播傳送的port

int main()
{
	struct sockaddr_in serv , clnt;

	int i = 1 , n;

	char str[MAXLINE];

    //set WSA and initial WSAStartup
	SOCKET serv_sd;
	WSADATA wsadata;

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , &wsadata );

	//使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

    //開啟廣播的參數
	BOOL broadcast = TRUE;

    //設定廣播
	setsockopt( serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast) );

	int clnt_len = sizeof( clnt );

	printf( "server start broadcasting on port: %d\n" , BraodcastPort );

    //設定client的結構
	clnt.sin_addr.s_addr = inet_addr( "255.255.255.255" );
	clnt.sin_family = AF_INET;
	clnt.sin_port = htons( BraodcastPort );

	while( 1 )
    {
        //頻道1也就是port:5678只顯示數字
        clnt.sin_port = htons( BraodcastPort );
        memset( str , i % 10 + '0' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "(1) server broadcast on port %d: %s\n" , BraodcastPort ,  str );

        //頻道2也就是port:5679只顯示小寫英文
        clnt.sin_port = htons( BraodcastPort+1 );
        memset( str , (i-1) % 26 + 'a' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "(2) server broadcast on port %d: %s\n" , BraodcastPort+1 ,  str );

        //頻道3也就是port:5680只顯示大寫英文
        clnt.sin_port = htons( BraodcastPort+2 );
        memset( str , (i-1) % 26 + 'A' , sizeof(str) );  //設定str裡面要傳送的內容
        sendto( serv_sd , str , strlen(str) , 0 , (LPSOCKADDR)&clnt , clnt_len );  //用廣播的方式傳送訊息
        printf( "(3) server broadcast on port %d: %s\n" , BraodcastPort+2 ,  str );

        //緩衝時間1秒
        Sleep( 1000 );

        i++;
    }

    //關閉socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system("pause");
}
```

client程式碼:
```c=
#include<stdio.h>
#include<string.h>
#include<winsock.h>

#define MAXLINE 1024
#define BraodcastPort 5678  //廣播傳送的port

//global variable
SOCKET serv_sd;  //set WSA and initial WSAStartup
WSADATA wsadata;

char str[MAXLINE];
char str_r[MAXLINE];
struct sockaddr_in serv , clnt;
int time_out = 50 , n , channel = 1;

//負責接收server傳送過來的訊息並且輸出訊息內容
void *recv_messg( void *argu )
{
    while( 1 )
    {
        int clnt_len = sizeof( clnt );

        //接收server傳送過來的訊息
        n = recvfrom( serv_sd , str , MAXLINE , 0 , (LPSOCKADDR) &clnt , &clnt_len );

        //輸出訊息內容
        if( n > 0 )
        {
            printf( "client (from: %s): %s , %d\n" , inet_ntoa(clnt.sin_addr) , str , n );
        }
    }
}

int main()
{
	int n , i , j , total = 0 , thread_id = 0;

	//呼叫WSAStartup()註冊WinSock DLL的使用
	WSAStartup( 0x101 , (LPWSADATA) &wsadata );

    //使用UDP協定
	serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

	//開啟廣播的參數
	BOOL broadcast = TRUE;

	//設定廣播
	if( setsockopt(serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broadcast , sizeof(broadcast)) < 0 )
    {
        printf( "setsockopt() error !\n" );
    }

    //設定server的結構
	serv.sin_addr.s_addr = 0;  //0表示使用電腦自己的IP
	serv.sin_family = AF_INET;
	serv.sin_port = htons( BraodcastPort );

	//綁定server結構裡設定的資訊
	if( bind(serv_sd , (LPSOCKADDR) &serv , sizeof(serv)) < 0 )
    {
        printf( "bind() error !\n" );

        system( "pause" );

        return 0;
    }

    int serv_len = sizeof( serv );

    //建立一個thread來接收server傳送過來的訊息
    CreateThread( NULL , 0 , (LPTHREAD_START_ROUTINE) recv_messg , NULL , 0 , (LPDWORD) &thread_id );

    //負責處理切換port，也就是其他頻道的部分
    while( 1 )
    {
        scanf( "%d" , &channel );

        printf( "switch to channel %d\n" , channel );

        printf( "\n" );

        //重新設定與綁定UDP協定的參數，這樣才能切換port

        //關閉TCP socket
	    closesocket(serv_sd);

	    //使用UDP協定
	    serv_sd = socket( AF_INET , SOCK_DGRAM , 0 );

	    //開啟廣播的參數
	    BOOL broad_cast = TRUE;

	    //設定廣播
	    if( setsockopt(serv_sd , SOL_SOCKET , SO_BROADCAST , (const char*)&broad_cast , sizeof(broad_cast)) < 0 )
        {
            printf( "setsockopt() error !\n" );
        }

        //設定client的結構
	    serv.sin_addr.s_addr = 0;  //0表示使用電腦自己的IP
	    serv.sin_family = AF_INET;

	    if( channel == 1 )  //切換頻道1也就是port:5678 只顯示數字
        {
            serv.sin_port = htons( BraodcastPort );

            //綁定server結構裡設定的資訊
            if( bind(serv_sd , (LPSOCKADDR) &serv , sizeof(serv)) < 0 )
            {
                printf( "bind() error !\n" );

                system( "pause" );

                return 0;
            }

        }
        else if( channel == 2 )  //切換頻道2也就是port:5679 只顯示小寫英文
        {
            serv.sin_port = htons( BraodcastPort+1 );

            //綁定server結構裡設定的資訊
            if( bind(serv_sd , (LPSOCKADDR) &serv , sizeof(serv)) < 0 )
            {
                printf( "bind() error !\n" );

                system( "pause" );

                return 0;
            }
        }
        else if( channel == 3 )  //切換頻道3也就是port:5680 只顯示大寫英文
        {
            serv.sin_port = htons( BraodcastPort+2 );

            //綁定server結構裡設定的資訊
            if( bind(serv_sd , (LPSOCKADDR) &serv , sizeof(serv)) < 0 )
            {
                printf( "bind() error !\n" );

                system( "pause" );

                return 0;
            }
        }
    }

    //關閉TCP socket
	closesocket(serv_sd);

	//結束WinSock DLL的使用
	WSACleanup();

	system( "pause" );
}
```

## 本週心得
這次老師教的課程為廣播的應用，其實在大二的計算機網路課程就知道網路的傳送有很多方式，有單播、廣播、群播...等，但是都沒有真的實作過，但是這次老師教的主題剛好是廣播的應用，所以我非常高興可以利用程式碼的實作來更了解廣播的原理以及使用，我覺得廣播的程式碼非常簡單與容易，比起上一次的thread真的有差，而且廣播也很容易了解，但是最怕就是如果廣播的程式碼設定或是使用錯誤的話，可能會造成廣播風暴，所以這次的作業與練習我非常的開心可以實作廣播的應用，因為可能之後的專題或是出去工作都有可能使用到廣播的技術，除了廣播之外，網路還有很多傳送方式，也希望老師可以講解其他傳送方式的應用與課程，我非常期待老師下一次課程的內容與教學，很好奇老師會教什麼主題，謝謝老師的教導與助教大哥那麼用心的改作業，老師真的要好好犒賞助教大哥👍

<br>

<center><img style="margin-top:auto;border:1px #eee;width:80%;" src="https://hackmd.io/_uploads/ry3gLil8h.png" /></center>

### 作者: 廖經翰