Anda di halaman 1dari 22

‫ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﯽ ﺷﺒﮑﻪ و اﻳﻨﺘﺮﻧﺖ در ‪ VB‬ﺑﺨﺶ اول‬

‫ﻣﺮوری ﺑﺮ ‪TCP/IP‬‬

‫ﻧﮑﺘﻪ ‪ :‬ﻣﻄﺎﻟﺐ زﻳﺮ ﺗﻨﻬﺎ در ﺣﺪ ﻳﮏ ﻳﺎدﺁوري ﻣﻲ ﺑﺎﺷﺪ ‪ .‬اﮔﺮ اﻃﻼﻋﺎت ﮐﻤﻲ در ﻣﻮرد ‪ TCP/IP‬دارﻳﺪ ﺑﻪ ﮐﺘﺎﺑﻬﺎي ﻣﻮﺟﻮد ﻣﺮاﺟﻌﻪ‬
‫ﮐﻨﻴﺪ ‪.‬‬

‫ﭘﺮوﺗﮑﻞ ‪ : Protocol‬ﻗﺮاردادي اﺳﺖ ﺑﺮاي ﺑﺮﻗﺮاري ارﺗﺒﺎط در ﺷﺒﮑﻪ‬

‫ﻣﺪل ‪ : TCP/IP‬ﻣﺠﻤﻮﻋﻪ اي از ﭘﺮوﺗﮑﻠﻬﺎي ارﺗﺒﺎﻃﻲ ﻣﺮﺗﺒﻂ ﺑﻬﻢ اﺳﺖ ﮐﻪ ﻣﮑﺎﻧﻴﺰﻣﻬﺎ و ﺳﺮوﻳﺴﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺟﻬﺖ ﺑﺮﻗﺮاري‬
‫ارﺗﺒﺎط در اﻳﻨﺘﺮﻧﺖ را ﻣﻬﻴﺎ ﻣﻲ ﮐﻨﻨﺪ ‪ .‬اﻳﻦ ﻣﺪل ﺷﺎﻣﻞ ‪ ۴‬ﻻﻳﻪ اﺳﺖ ‪:‬‬
‫‪ - ١‬ﻻﻳﻪ ﮐﺎرﺑﺮد ‪ : Application Layer‬ﺷﺎﻣﻞ ﺑﺮﻧﺎﻣﻪ هﺎي ﮐﺎرﺑﺮدي و ﭘﺮوﺗﮑﻠﻬﺎﻳﻲ ﻣﺜﻞ ‪ Pop ،Smtp ،Ftp ،Http‬و ‪ Telnet‬ﻣﻲ‬
‫ﺑﺎﺷﺪ ‪.‬‬
‫‪ - ٢‬ﻻﻳﻪ اﻧﺘﻘﺎل ‪ : Transport Layer‬اﻳﻦ ﻻﻳﻪ ﺷﺎﻣﻞ دو ﭘﺮوﺗﮑﻞ ‪ TCP‬و ‪ UDP‬اﺳﺖ ‪ .‬ﭘﺮوﺗﮑﻞ ‪ TCP‬وﻇﻴﻔﻪ ﮐﻨﺘﺮل رﺳﻴﺪن ﺑﺴﺘﻪ‬
‫هﺎي دادﻩ ﺑﻪ ﻣﻘﺼﺪ ) ‪ TCP/IP‬دادﻩ هﺎ را ﺑﻪ ﺑﺴﺘﻪ هﺎي ﮐﻮﭼﮑﻲ ﺗﻘﺴﻴﻢ ﻣﻲ ﮐﻨﺪ ﮐﻪ هﺮ ﺑﺴﺘﻪ ﺣﺎوي ﺁدرس ﻓﺮﺳﺘﻨﺪﻩ ‪،‬‬
‫ﮔﻴﺮﻧﺪﻩ و ﺷﻤﺎرﻩ ﺑﺴﺘﻪ ﻣﻲ ﺑﺎﺷﺪ ( ‪ ،‬ﺗﺼﺤﻴﺢ ﺧﻄﺎ و ﻣﺮﺗﺐ ﺳﺎزي ﺑﺴﺘﻪ هﺎ را ﺑﺮﻋﻬﺪﻩ دارد ‪ UDP .‬ﭘﺮوﺗﮑﻠﻲ ﺷﺒﻴﻪ ‪TCP‬‬
‫اﺳﺖ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﮐﻪ هﻴﭻ ﺿﻤﺎﻧﺘﻲ ﺑﺮاي رﺳﻴﺪن ﺑﺴﺘﻪ هﺎي اﻃﻼﻋﺎﺗﻲ در ﺁن وﺟﻮد ﻧﺪارد و ﻣﻌﻤﻮﻻً در اﻧﺘﻘﺎل ﺻﻮت و وﻳﺪﺋﻮ‬
‫روي اﻳﻨﺘﺰﻧﺖ اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪.‬‬
‫‪ - ٣‬ﻻﻳﻪ اﻳﻨﺘﺮﻧﺖ ‪ : Layer Internet‬ﺷﺎﻣﻞ ﭘﺮوﺗﮑﻞ ‪ IP‬اﺳﺖ ﮐﻪ ﻣﺴﺌﻮل ﻣﺴﻴﺮﻳﺎﺑﻲ ﺑﺴﺘﻪ هﺎي اﻃﻼﻋﺎﺗﻲ ﻣﻲ ﺑﺎﺷﺪ ‪.‬‬
‫‪ - ۴‬ﻻﻳﻪ دﺳﺘﺮﺳﻲ ﺑﻪ ﺷﺒﮑﻪ ‪ : Link Layer‬ﺷﺎﻣﻞ ﺑﺨﺸﻲ از هﺴﺘﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ و ﻧﻴﺰ دراﻳﻮرهﺎي واﺳﻂ ﺷﺒﮑﻪ ﺑﺮاي ﮐﺎر‬
‫ﺑﺎ ﺳﺨﺖ اﻓﺰار ﺷﺒﮑﻪ ﻣﻲ ﺑﺎﺷﺪ ‪.‬‬

‫ﺳﻮﮐﺖ ‪ Socket‬و ﭘﻮرت ‪ : Port‬ﺳﻮﮐﺖ ﻳﮏ ورودي اﻧﺘﺰاﻋﻲ در ﻻﻳﻪ اﻧﺘﻘﺎل ﻣﻲ ﺑﺎﺷﺪ ﮐﻪ ﺑﺮاي اﻳﺠﺎد ارﺗﺒﺎﻃﺎت ﻣﺨﺘﻠﻒ ‪TCP/IP‬‬
‫ﺑﮑﺎر ﻣﻲ رود ‪ .‬اﻏﻠﺐ ﺑﺮﻧﺎﻣﻪ هﺎي ﮐﺎرﺑﺮدي ﮐﻪ از ‪ TCP‬و ‪ UDP‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﻨﺪ ‪ ،‬ﻋﻤﻠﻴﺎت اﻧﺘﻘﺎل اﻃﻼﻋﺎت ﺧﻮد را ﺑﺎ ﺳﺎﺧﺖ‬
‫ﻳﮏ ﺳﻮﮐﺖ و ﺳﭙﺲ اﻧﺠﺎم ﻳﮑﺴﺮي ﻋﻤﻠﻴﺎت روي ﺁن اﻧﺠﺎم ﻣﻲ دهﻨﺪ ‪ .‬اﻳﻦ ﻋﻤﻠﻴﺎت ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ - ١‬ﻋﻤﻠﻴﺎت ﮐﻨﺘﺮﻟﻲ ‪ :‬ﺷﺎﻣﻞ اﺧﺘﺼﺎص ﻳﮏ ﺷﻤﺎرﻩ ﭘﻮرت ﺑﻪ ﺳﻮﮐﺖ ‪ initiate ،‬ﮐﺮدن ﻳﺎ ‪ accpet‬ﮐﺮدن ﻳﮏ ارﺗﺒﺎط ‪ ،‬از ﺑﻴﻦ ﺑﺮدن‬
‫ﺳﻮﮐﺖ‬
‫‪ - ٢‬ﻋﻤﻠﻴﺎت اﻧﺘﻘﺎل دادﻩ ‪ :‬ﺷﺎﻣﻞ ﻧﻮﺷﺘﻦ دادﻩ روي ﺳﻮﮐﺖ و ﺧﻮاﻧﺪن دادﻩ از ﺳﻮﮐﺖ‬
‫‪ - ٣‬ﻋﻤﻠﻴﺎت ﺑﺮرﺳﻲ وﺿﻌﻴﺖ ‪ :‬ﻣﺜﻞ ﭘﻴﺪا ﮐﺮدن ﺁدرس ‪ IP‬ﻣﺮﺑﻮط ﺑﻪ ﺳﻮﮐﺖ ‪ ،‬ﭘﻴﺪا ﮐﺮدن ﺷﻤﺎرﻩ ﭘﻮرت ﺳﻮﮐﺖ و ﻏﻴﺮﻩ‬

‫‪ : HTTP‬ﭘﺮوﺗﮑﻞ اﻧﺘﻘﺎل دادﻩ ﺑﺮاي وب اﺳﺖ ‪.‬‬

‫‪ : FTP‬ﭘﺮوﺗﮑﻞ اﻧﺘﻘﺎل ﻓﺎﻳﻞ روي اﻳﻨﺘﺮﻧﺖ اﺳﺖ ‪.‬‬

‫‪ SMTP‬و ‪ : POP‬ﭘﺮوﺗﮑﻠﻬﺎي ارﺳﺎل و درﻳﺎﻓﺖ ‪ email‬ﻣﻲ ﺑﺎﺷﻨﺪ ‪.‬‬


‫ﮐﻨﺘﺮل ‪ – Web Browser‬ﺳﺎﺧﺖ ﻣﺮورﮔﺮ ﺻﻔﺤﺎت وب‬

‫ﺑﺮﻧﺎﻣﻪ ‪ Internet Explorer‬ﻳﺎ ‪ iexplore.exe‬در واﻗﻊ ﺑﺮﻧﺎﻣﻪ ﮐﻮﭼﮑﻲ اﺳﺖ ﮐﻪ وﻇﻴﻔﻪ اﺻﻠﻲ ﺁن اﻳﺠﺎد ﭼﺎرﭼﻮﺑﻲ ﺑﺮاي ﺑﻬﻢ‬
‫ﭘﻴﻮﺳﺘﻦ ﻋﻨﺎﺻﺮ ﻣﺨﺘﻠﻒ اﺳﺖ و اﻳﻦ ﻋﻨﺎﺻﺮ هﺴﺘﻨﺪ ﮐﻪ وﻇﺎﻳﻒ اﺻﻠﻲ ﻣﺜﻞ ‪ load‬ﮐﺮدن ﺻﻔﺤﺎت وب ‪ ،‬اﺟﺮاي ﮐﺪهﺎي ‪ Html‬و‬
‫ﻏﻴﺮﻩ را اﻧﺠﺎم ﻣﻲ دهﻨﺪ ‪ .‬اﺻﻠﻲ ﺗﺮﻳﻦ ﻋﻨﺼﺮي ﮐﻪ ﻣﺴﺘﻘﻴﻤﺎً ﺗﻮﺳﻂ ‪ iexplore.exe‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ﮐﻨﺘﺮل ‪) Webbrowser‬‬
‫ﻣﻮﺟﻮد در ﻓﺎﻳﻞ ‪ ( shdocrw.dll‬ﻣﻲ ﺑﺎﺷﺪ ‪ .‬وﻇﻴﻔﻪ اﻳﻦ ﻓﺎﻳﻞ ‪ ، dll‬ﻋﺒﺎرت اﺳﺖ از ﺣﺮﮐﺖ ﺑﻴﻦ ﺻﻔﺤﺎت وب ‪ ،‬ﻣﺪﻳﺮﻳﺖ ﺗﺎرﻳﺨﭽﻪ‬
‫ﺻﻔﺤﺎت دﻳﺪﻩ ﺷﺪﻩ و ﻏﻴﺮﻩ ‪ .‬اﻳﻦ ﻓﺎﻳﻞ ﺧﻮد از ﻓﺎﻳﻞ دﻳﮕﺮي ﺑﻨﺎم ‪ Mshtml.dll‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﺪ ﮐﻪ وﻇﻴﻔﻪ ﺁن ﺑﺮرﺳﻲ و اﺟﺮاي‬
‫ﻓﺎﻳﻠﻬﺎي ‪ html‬اﺳﺖ ‪ .‬ﻣﺎﻳﮑﺮوﺳﺎﻓﺖ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن اﻳﻦ اﻣﮑﺎن را دادﻩ ﮐﻪ ﺑﺘﻮاﻧﻨﺪ در ﺑﺮﻧﺎﻣﻪ هﺎﻳﺸﺎن از ﮐﻨﺘﺮل ‪webbrowser‬‬
‫اﺳﺘﻔﺎدﻩ ﮐﻨﻨﺪ ‪ .‬ﺑﺎ اﺳﺘﻔﺎدﻩ از اﻳﻦ ﮐﻨﺘﺮل ﻣﻲ ﺗﻮان ﺑﻪ ﺳﺎدﮔﻲ ﻳﮏ ﻣﺮورﮔﺮ وب ﺗﻘﺮﻳﺒﺎً ﮐﺎﻣﻞ ﺳﺎﺧﺖ ‪.‬‬

‫ﺧﺼﻮﺻﻴﺎت ﮐﻨﺘﺮل ‪: Webbrowser‬‬


‫‪ Webbrowser‬ﻋﻼوﻩ ﺑﺮ ﺧﻮاص اﺳﺘﺎﻧﺪاردي ﻣﺜﻞ ‪ height ،width‬و … ﺧﻮاص زﻳﺮ را دارد ‪:‬‬
‫‪ : Busy – 1‬اﮔﺮ در ﺣﺎل ‪ load‬ﮐﺮدن ﻳﮏ ﺻﻔﺤﻪ ﻳﺎ در ﺣﺎل ﺟﺴﺘﺠﻮ در وب ﺑﺎﺷﺪ اﻳﻦ ﺧﺎﺻﻴﺖ ‪ True‬اﺳﺖ ‪ .‬ﺗﻮﺳﻂ ﻣﺘﺪ ‪Stop‬‬
‫ﻣﻲ ﺗﻮان ﻋﻤﻠﻴﺎت ﺟﺎري را ﻣﺘﻮﻗﻒ ﮐﺮد ‪.‬‬
‫‪ : Container – 2‬ارﺟﺎع ﺑﻪ ﺷﻲ ﻧﮕﻬﺪارﻧﺪﻩ ﮐﻨﺘﺮل ‪webbrowser‬‬
‫‪ : Document – 3‬ارﺟﺎع ﺑﻪ ﺻﻔﺤﻪ ‪ html‬ﻓﻌﻠﻲ ‪ .‬ﺑﺮاي ﮐﺎر ﺑﺎ اﻳﻦ ﺻﻔﺤﻪ ‪ html‬ﻣﻲ ﺗﻮان از ﺧﻮاص و ﻣﺘﺪهﺎﺑﻲ ﺷﻲ‬
‫‪ Document‬اﺳﺘﻔﺎدﻩ ﮐﺮد ‪.‬‬
‫‪ : LocationName – 4‬ﺣﺎوي ﺁدرس ﻣﺤﻠﻲ اﺳﺖ ﮐﻪ اﮐﻨﻮن در ﮐﻨﺘﺮل ‪ load ،webbrowser‬ﺷﺪﻩ اﺳﺖ ‪ .‬اﮔﺮ اﻳﻦ ﻣﺤﻞ ﻳﮏ‬
‫ﺻﻔﺤﻪ ‪ html‬ﺑﺎﺷﺪ ﻋﻨﻮان ﺁن ﺻﻔﺤﻪ ﺧﻮاهﺪ ﺑﻮد و اﮔﺮ اﻳﻦ ﻣﺤﻞ ﻳﮏ ﻓﺎﻳﻞ در ﺷﺒﮑﻪ ﺑﺎﺷﺪ ﻣﺴﻴﺮ ﮐﺎﻣﻞ ﺁن ﻓﺎﻳﻞ ﺧﻮاهﺪ ﺑﻮد ‪.‬‬
‫‪ : LocationURL – 5‬ﺣﺎوي ‪ url‬ﻣﺤﻠﻲ اﺳﺖ ﮐﻪ ﻓﻌﻼً در ﮐﻨﺘﺮل ‪ load ،webbrowser‬ﺷﺪﻩ اﺳﺖ ‪.‬‬
‫‪ : Offline – 6‬اﮔﺮ ﮐﻨﺘﺮل ‪ webbrowser‬در ﺣﺎﻟﺖ ﻋﺪم اﺗﺼﺎل ﺑﺎﺷﺪ ﻣﻘﺪار ﺁن ‪ True‬و در ﻏﻴﺮاﻳﻨﺼﻮرت ‪ False‬اﺳﺖ ‪.‬‬
‫‪ : Parent – 7‬ﻓﺮﻣﻲ را ﻧﺸﺎن ﻣﻲ دهﺪ ﮐﻪ ﮐﻨﺘﺮل ‪ webbrowser‬در ﺁن ﻗﺮار دارد ‪.‬‬
‫‪ : ReadyState – 8‬وﺿﻌﻴﺖ ﮐﻨﺘﺮل ‪ webbrowser‬را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ‪.‬‬

‫ﻣﺘﺪهﺎي ﮐﻨﺘﺮل ‪ : webbrowser‬اﻳﻦ ﻣﺘﺪهﺎ ﻣﺮﺑﻮط ﺑﻪ ﻣﺮور در ﺻﻔﺤﺎت وب هﺴﺘﻨﺪ ‪:‬‬


‫‪ : GoBack -1‬در ﻟﻴﺴﺖ ﺗﺎرﻳﺨﭽﻪ ‪ url‬هﺎ ‪ ،‬ﻳﮑﻲ ﺑﻪ ﻋﻘﺐ ﺑﺮﻣﻲ ﮔﺮدد ‪.‬‬
‫‪ : GoForward – 2‬در ﻟﻴﺴﺖ ﺗﺎرﻳﺨﭽﻪ ‪ url‬هﺎ ‪ ،‬ﻳﮑﻲ ﺑﻪ ﺟﻠﻮ ﻣﻲ رود ‪.‬‬
‫‪ : GoHome – 3‬ﺑﻪ ‪ homepage‬ﻣﺮورﮔﺮ ﻣﻲ رود ‪.‬‬
‫‪ : Navigate – 4‬ﺑﻪ ﻳﮏ ‪ url‬ﻳﺎ ﻓﺎﻳﻞ ﻣﻲ رود ‪ .‬ﺳﺎﺧﺘﺎر اﻳﻦ ﻣﺘﺪ ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪Flags,][TargetFrameName,][PostData,][Headers]x] Navigate URL‬‬

‫‪ URL‬ﺁدرس ﻣﻘﺼﺪ ﻣﻲ ﺑﺎﺷﺪ ‪ Flags .‬ﻧﺤﻮﻩ ﺑﺎز ﺷﺪن ﺁدرس ﻣﻘﺼﺪ را ﺗﻌﻴﻴﻦ ﻣﻲ ﮐﻨﺪ ‪ .‬اﮔﺮ اﻳﻦ ﭘﺎراﻣﺘﺮ ذﮐﺮ ﻧﺸﻮد ﺁدرس ﺟﺪﻳﺪ‬
‫در ﭘﻨﺠﺮﻩ ﻓﻌﻠﻲ ﺑﺎز ﺧﻮاهﺪ ﺷﺪ و ﺑﻪ ﻟﻴﺴﺖ ﺗﺎرﻳﺨﭽﻪ اﺿﺎﻓﻪ ﺷﺪﻩ و اﮔﺮ ﮐﭙﻲ ﺁن در ‪ cache temperory‬ﻣﻮﺟﻮد ﺑﺎﺷﺪ از ﺁﻧﺠﺎ‬
‫ﺧﻮاﻧﺪﻩ ﻣﻲ ﺷﻮد ‪ .‬ﻣﻘﺎدﻳﺮ ﭘﺎراﻣﺘﺮ ‪ Flags‬ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ : NavOpenInNewWindow -‬ﺁدرس ﺟﺪﻳﺪ را در ﭘﻨﺠﺮﻩ ﺟﺪﻳﺪي ﺑﺎز ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫‪ : NavNoHistory -‬ﺑﻪ ﻟﻴﺴﺖ ﺗﺎرﻳﺨﭽﻪ اﺿﺎﻓﻪ ﻧﻤﻲ ﺷﻮد ﺑﻠﮑﻪ ﺟﺎﻳﮕﺰﻳﻦ ﺻﻔﺤﻪ ﻓﻌﻠﻲ ﻣﻲ ﺷﻮد ‪.‬‬
‫‪ : NavNoReadFromCache -‬ﺻﻔﺤﻪ ﺟﺪﻳﺪ از ‪ cache‬ﺧﻮاﻧﺪﻩ ﻧﻤﻲ ﺷﻮد ‪.‬‬
‫‪ : NavNoWriteToCache -‬ﺻﻔﺤﻪ ﺟﺪﻳﺪ روي ‪ cache‬ﻧﻮﺷﺘﻪ ﻧﻤﻲ ﺷﻮد‬

‫‪ Event‬هﺎي ﮐﻨﺘﺮل ‪ : webbrowser‬اﻳﻦ ‪ event‬هﺎ ﻣﺮﺑﻮط ﺑﻪ ﻣﺮور در وب و ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ ﺁن هﺴﺘﻨﺪ ‪:‬‬
‫‪ : CommandStateChange – 1‬ﺑﺮاي ﻓﻌﺎل ﻳﺎ ﻏﻴﺮﻓﻌﺎل ﮐﺮدن دﮐﻤﻪ هﺎي ‪ Forward‬و ‪ Back‬در ﻣﺮورﮔﺮ اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪.‬‬
‫ﺷﮑﻞ ﮐﻠﻲ ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ‪ event‬ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬
‫‪(Command As Long, ByVal Enable As Boolean Private Sub WebBrowser1_CommandStateChange(ByVal‬‬

‫ﮐﻪ ‪ command‬ﻓﺮﻣﺎﻧﻲ اﺳﺖ ﮐﻪ ﺣﺎﻟﺖ ﻓﻌﺎل ﺁن ﺗﻐﻴﻴﺮ ﮐﺮدﻩ اﺳﺖ و دو ﻣﻘﺪار ﻣﻲ ﮔﻴﺮد ‪ 1 :‬و ‪ 3‬ﮐﻪ ﺑﺘﺮﺗﻴﺐ ﻣﻌﺎدل ﻓﺮﻣﺎﻧﻬﺎي‬
‫‪ GoForward‬و ‪ GoBack‬هﺴﺘﻨﺪ ‪.‬‬
‫‪ Enable‬ﻓﻌﺎل ﻳﺎ ﻏﻴﺮﻓﻌﺎل ﺑﻮدن ﻓﺮﻣﺎن را ﺗﻌﻴﻴﻦ ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫‪ : DocumentComplete – 2‬اﻳﻦ ‪ event‬زﻣﺎﻧﻲ ﻓﻌﺎل ﻣﻲ ﺷﻮد ﮐﻪ ﺻﻔﺤﻪ در ﺣﺎل ‪ load‬ﺷﺪن ﺑﻪ ﺣﺎﻟﺖ‬
‫‪ ReadyState_Complete‬ﺑﺮود ‪ .‬ﺷﮑﻞ ﮐﻠﻲ ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ‪ event‬ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬
‫‪(Variant Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As‬‬
‫ﮐﻪ ‪ pDisp‬ارﺟﺎﻋﻲ ﺑﻪ ﮐﻨﺘﺮل ‪ webbrowser‬اﺳﺖ ﮐﻪ ‪ event‬در ﺁن رخ دادﻩ اﺳﺖ و ‪ URL‬ﺁدرس ﺻﻔﺤﻪ در ﺣﺎل ‪ load‬ﺷﺪن‬
‫اﺳﺖ ‪.‬‬
‫‪ : DownloadBegin – 3‬اﻳﻦ ‪ event‬در ﺁﻏﺎز ﺣﺮﮐﺖ ﺑﻪ ﺻﻔﺤﻪ ﺟﺪﻳﺪ روي ﻣﻲ دهﺪ و هﻴﭻ ﭘﺎراﻣﺘﺮي ﻧﻤﻲ ﮔﻴﺮد ‪ .‬ﻣﺮورﮔﺮ ﻣﻲ‬
‫ﺗﻮاﻧﺪ در اﻳﻦ ‪ event‬ﭘﻴﻐﺎﻣﻲ ﺑﺮاي ﺷﺮوع ﻋﻤﻠﻴﺎت ﺟﺪﻳﺪ ﻧﺸﺎن ﻣﻲ دهﺪ ‪.‬‬
‫‪ : DownloadComplete – 4‬اﻳﻦ ‪ event‬در ﭘﺎﻳﺎن ﻋﻤﻠﻴﺎت ﻳﺎ در ﺻﻮرت اﻧﺼﺮاف ﮐﺎرﺑﺮ ﻳﺎ ﺑﺮوز ﺧﻄﺎ روي ﻣﻲ دهﺪ ‪.‬‬
‫‪ : ProgressChange – 5‬ﺑﺎ ﺑﺮوز هﺮ ﺗﻐﻴﻴﺮي در وﺿﻌﻴﺖ ‪ ، load‬اﻳﻦ ‪ event‬روي ﻣﻲ دهﺪ ‪ .‬ﺷﮑﻞ ﮐﻠﻲ ﻓﺮاﺧﻮاﻧﻲ ﺁن ﺑﺼﻮرت‬
‫زﻳﺮ اﺳﺖ ‪:‬‬

‫‪(Progress As Long, ByVal ProgressMax As Long Private Sub WebBrowser1_ProgressChange(ByVal‬‬

‫ﮐﻪ ‪ Progress‬ﻧﺸﺎن دهﻨﺪﻩ ﭘﻴﺸﺮﻓﺖ ﻋﻤﻠﻴﺎت ) ﺑﺎﻳﺘﻬﺎي ‪ load‬ﺷﺪﻩ ( اﺳﺖ ‪ .‬ﭘﺎراﻣﺘﺮ ‪ ProgressMax‬ﺗﻌﺪاد ﮐﻞ ﺑﺎﻳﺘﻬﺎﻳﻲ ﮐﻪ‬
‫ﺑﺎﻳﺪ ‪ load‬ﺷﻮﻧﺪ را ﻧﺸﺎن ﻣﻲ دهﺪ ﺑﻨﺎﺑﺮ اﻳﻦ ‪:‬‬

‫)‪=Progress/ProgressMax)*100‬درﺻﺪ ﭘﻴﺸﺮﻓﺖ ﻋﻤﻠﻴﺎت ‪load‬‬

‫ﻳﮏ ﻣﺜﺎل ﺳﺎدﻩ ‪:‬‬


‫از ﻣﻨﻮي ‪ project‬ﻣﻮرد ‪ components‬را اﻧﺘﺨﺎب ﮐﻨﻴﺪ و از ﻟﻴﺴﺖ ﮐﻨﺘﺮﻟﻬﺎ ‪ Microsoft Internet Controls ،‬را ﺑﻪ ‪ toolbar‬ﺧﻮد‬
‫اﺿﺎﻓﻪ ﮐﻨﻴﺪ ‪ .‬ﻳﮏ ﮐﻨﺘﺮل ‪ WebBrowser‬روي ﻓﺮم ﻗﺮار دهﻴﺪ و ﺳﺎﻳﺰ ﺁﻧﺮا ﺑﻪ اﻧﺪازﻩ اﺑﻌﺎد ﻓﺮم ﺧﻮد ﻗﺮار دهﻴﺪ ‪ .‬ﻳﮏ ‪ textbox‬و ﻳﮏ‬
‫دﮐﻤﻪ روي ﻓﺮم ﻗﺮار دهﻴﺪ ‪ .‬ﮐﺪ زﻳﺮ را ﺑﺮاي ‪ event‬ﻣﺮﺑﻮط ﺑﻪ ﮐﻠﻴﮏ دﮐﻤﻪ ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪WebBrowser.Navigate textbox.text‬‬

‫ﮐﻨﺘﺮل ‪ - Internet Transfer‬ﻗﺴﻤﺖ اول‬

‫ﻣﻘﺪﻣﻪ ‪ :‬ﮐﻨﺘﺮل ‪ Internet Transfer‬ﻧﺴﺒﺖ ﺑﻪ ﮐﻨﺘﺮل ‪ WebBrowser‬ﮐﻪ در روزهﺎي ﻗﺒﻠﻲ ﻣﻌﺮﻓﻲ ﺷﺪ در ﺳﻄﺢ ﭘﺎﻳﻴﻨﺘﺮي‬
‫ﻗﺮار دارد ‪ .‬اﻳﻦ ﮐﻨﺘﺮل ﺑﺎ اﺳﺘﻔﺎدﻩ از دو ﭘﺮوﺗﮑﻞ ‪ HTTP‬و ‪ FTP‬ﻣﻲ ﺗﻮاﻧﺪ دادﻩ هﺎ را ﻣﻨﺘﻘﻞ ﮐﻨﺪ ‪ .‬اﻳﻦ ﮐﻨﺘﺮل زﻣﺎﻧﻴﮑﻪ از ﭘﺮوﺗﮑﻞ‬
‫‪ HTTP‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﺪ ﺑﺎ هﻤﺎن روش ﮐﻨﺘﺮل ‪ WebBrowser‬ﺑﻪ ﺳﺮوﻳﺲ دهﻨﺪﻩ ﺻﻔﺤﺎت وب ﻣﺘﺼﻞ ﻣﻲ ﺷﻮد اﻣﺎ ﺑﺠﺎي ﺁﻧﮑﻪ‬
‫ﺻﻔﺤﻪ وب را ﻧﻤﺎﻳﺶ دهﺪ ﻣﺘﻦ ‪ Html‬ﺻﻔﺤﻪ را ﺑﺎزﻳﺎﺑﻲ ﻣﻲ ﮐﻨﺪ ‪ .‬هﻤﭽﻨﻴﻦ زﻣﺎﻧﻴﮑﻪ اﻳﻦ ﮐﻨﺘﺮل از ﭘﺮوﺗﮑﻞ ‪ FTP‬اﺳﺘﻔﺎدﻩ ﻣﻲ‬
‫ﮐﻨﺪ ﻗﺎدرﺳﺖ ﻓﺎﻳﻠﻬﺎ را ﺑﻴﻦ ﮐﺎﻣﭙﻴﻮﺗﺮهﺎي روي ﺷﺒﮑﻪ ﻣﻨﺘﻘﻞ ﺳﺎزد ‪.‬‬
‫اﺗﺼﺎﻻت ‪ : HTTP‬هﻤﺎﻧﻄﻮر ﮐﻪ ﻣﻲ داﻧﻴﺪ ‪ ،‬ﭘﺮوﺗﮑﻞ ‪ HTTP‬اﺳﺘﺎﻧﺪارد وب ﻣﻲ ﺑﺎﺷﺪ ‪ .‬ﺻﻔﺤﺎت وب ﺑﺎ زﺑﺎن ‪ Html‬ﻧﻮﺷﺘﻪ ﻣﻲ‬
‫ﺷﻮﻧﺪ و اﻧﺘﻘﺎل ﺁﻧﻬﺎ از ‪ server‬ﺑﻪ ‪ client‬ﺗﻮﺳﻂ ﭘﺮوﺗﮑﻞ ‪ HTTP‬ﺻﻮرت ﻣﻲ ﮔﻴﺮد ‪.‬‬
‫ﻣﺘﺪ ‪ : OpenURL‬ﺳﺎدﻩ ﺗﺮﻳﻦ راﻩ اﺳﺘﻔﺎدﻩ از ﮐﻨﺘﺮل ‪ IT‬ﻣﺘﺪ ‪ OpenURL‬اﺳﺖ ‪ .‬ﺷﮑﻞ ﮐﻠﻲ اﻳﻦ ﻣﺘﺪ ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪Inet.OpenURL(url,DataType)x‬‬

‫ﮐﻪ ‪ url‬ﺁدرس ﺻﻔﺤﻪ وب و ‪ DataType‬ﻧﻮع دادﻩ ﺑﺎزﻳﺎﺑﻲ ﺷﻮﻧﺪﻩ اﺳﺖ و دو ﻣﻘﺪار ‪ ) icString‬دادﻩ ﻣﺘﻨﻲ ( ﻳﺎ ‪) icByteArray‬‬
‫دادﻩ ﺑﺎﻳﻨﺮي ( را ﻣﻲ ﮔﻴﺮد ‪ .‬ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ اﻳﻦ ﻣﺘﺪ ‪ ،‬دادﻩ هﺎي ﻣﻨﺘﻘﻞ ﺷﺪﻩ اﺳﺖ ‪.‬‬
‫اﻳﻦ ﻣﺘﺪ ﺑﺼﻮرت ﺳﻨﮑﺮون ﮐﺎر ﻣﻲ ﮐﻨﺪ ﻳﻌﻨﻲ در ﺗﻤﺎم ﻣﺪت ﮐﺎر ﺁن ﺑﺮﻧﺎﻣﻪ ﻧﻤﻲ ﺗﻮاﻧﺪ ﮐﺎر دﻳﮕﺮي اﻧﺠﺎم دهﺪ ‪ .‬اﮔﺮ از‬
‫‪ icByteArray‬اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ ﺑﺎﻳﺪ ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ ﺁﻧﺮا در ﻳﮏ اراﻳﻪ ﺑﺎﻳﺖ ﻗﺮار دهﻴﺪ ‪.‬‬
‫ﻣﺜﺎل ‪ : 1‬از ﺑﺨﺶ ‪ Component‬در ﻣﻨﻮي ‪ Project‬ﻣﻮرد ‪ Microsoft Internet Transfer Control 6.0‬را ﺑﻪ ‪ toolbar‬ﺧﻮد اﺿﺎﻓﻪ‬
‫ﮐﻨﻴﺪ ‪ .‬ﺳﭙﺲ ﻳﮏ ﮐﻨﺘﺮل ‪ IT‬روي ﻓﺮم ﻗﺮار دهﻴﺪ و هﻤﭽﻨﻴﻦ ﻳﮏ ‪ Rich Textbox‬و ﻳﮏ دﮐﻤﻪ روي ﻓﺮم ﻗﺮار دهﻴﺪ و ﮐﺪ زﻳﺮ را‬
‫ﺑﺮاي ‪ event‬ﻣﺮﺑﻮط ﺑﻪ ﮐﻠﻴﮏ دﮐﻤﻪ ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪TextBox.text=Inet.OpenURL(“www.microsoft.com”,icString)x‬‬

‫ﻣﺜﺎل ‪ : 2‬ﮐﺪ زﻳﺮ دادﻩ هﺎي ﺑﺎﻳﻨﺮي را از اﻳﻨﺘﺮﻧﺖ ﺧﻮاﻧﺪﻩ و ﺁﻧﻬﺎ را در ﻳﮏ ﻓﺎﻳﻞ ذﺧﻴﺮﻩ ﻣﻲ ﮐﻨﺪ ‪:‬‬

‫‪byte Dim b() as‬‬


‫‪B()=Inet.OpenURL(ftp://ftp.microsoft.com/test.zip,icByteArray)x‬‬
‫‪test.zip” For Access Write As #1\“ & App.path Open‬‬
‫‪Put #1,b()x‬‬
‫‪1# Close‬‬

‫روﻳﺪاد ‪ : StateChanged‬ﮐﻨﺘﺮل ‪ IT‬ﻓﻘﻂ ﻳﮏ ‪ event‬دارد ﮐﻪ ‪ StateChanged‬ﻣﻲ ﺑﺎﺷﺪ ‪ .‬اﻳﻦ ‪ event‬زﻣﺎﻧﻲ روي ﻣﻲ دهﺪ ﮐﻪ‬
‫‪ State‬ﮐﻨﺘﺮل ﺗﻐﻴﻴﺮ ﮐﻨﺪ ‪ State .‬هﺮ اﺗﻔﺎﻗﻲ اﺳﺖ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ از ﺁن ﻣﻄﻠﻊ ﺷﻮد ‪ .‬ﺗﻌﺮﻳﻒ ﮐﻠﻲ اﻳﻦ ‪ event‬ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪Inet_StateChanged(ByVal NewState As Integer)x‬‬

‫ﮐﻪ ‪ NewState‬ﻣﻘﺪاري اﺳﺖ ﮐﻪ ﺣﺎﻟﺖ ﺟﺪﻳﺪ را ﺑﻴﺎن ﻣﻲ ﮐﻨﺪ ‪ .‬ﻣﻘﺎدﻳﺮ ﻣﻤﮑﻦ اﻳﻦ ﭘﺎراﻣﺘﺮ ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ : icNone‬ﺣﺎﻟﺖ ﺗﻐﻴﻴﺮ ﻧﮑﺮدﻩ اﺳﺖ ‪.‬‬
‫‪ : icResolvingHost‬در ﺣﺎل ﺟﺴﺘﺠﻮي ﺁدرس ‪ IP‬ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻮردﻧﻈﺮ ‪.‬‬
‫‪ : icHostResolved‬ﺁدرس ‪ IP‬ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻮردﻧﻈﺮ ﻳﺎﻓﺖ ﺷﺪ ‪.‬‬
‫‪ : icConnecting‬در ﺣﺎل اﺗﺼﺎل ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ‬
‫‪ : icConnected‬اﺗﺼﺎل ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﺑﺮﻗﺮار ﺷﺪ ‪.‬‬
‫‪ : icRequesting‬در ﺣﺎل ارﺳﺎل درﺧﻮاﺳﺖ ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ‬
‫‪ : icRequestSent‬درﺧﻮاﺳﺖ ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ارﺳﺎل ﺷﺪ ‪.‬‬
‫‪ : icReceivingResponse‬در ﺣﺎل درﻳﺎﻓﺖ ﭘﺎﺳﺦ از ﮐﺎﻣﭙﻮﺗﺮ ﻣﻘﺼﺪ ‪.‬‬
‫‪ : icResponseReceived‬ﭘﺎﺳﺦ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ درﻳﺎﻓﺖ ﺷﺪ ‪.‬‬
‫‪ : icDisconnecting‬در ﺣﺎل ﻗﻄﻊ اﺗﺼﺎل ﺑﺎ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ‪.‬‬
‫‪ : icDisconnected‬اﺗﺼﺎل ﻣﻘﺼﺪ ﺑﺎ ﻣﻮﻓﻘﻴﺖ ﻗﻄﻊ ﺷﺪ ‪.‬‬
‫‪ : icError‬در ارﺗﺒﺎط ﺑﺎ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﺧﻄﺎﻳﻲ رخ دادﻩ اﺳﺖ ‪.‬‬
‫‪ : icResponseCompleted‬ﺗﮑﻤﻴﻞ ﭘﺎﺳﺦ – ﺗﻤﺎم دادﻩ هﺎ درﻳﺎﻓﺖ ﺷﺪ ‪.‬‬
‫ﺗﺸﺨﻴﺺ ﺧﻄﺎ در ﻋﻤﻠﻴﺎت اﻧﺘﻘﺎل دادﻩ اهﻤﻴﺖ ﺑﺎﻻﻳﻲ دارد و ‪ StateChanged‬در ﺻﻮرت ﺑﺮوز هﺮ ﺧﻄﺎﻳﻲ ﻣﻘﺪار ‪ icError‬را‬
‫ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و اﻃﻼﻋﺎت ﺧﻄﺎ را در دو ﺧﺎﺻﻴﺖ ‪ ResponseCode‬و ‪ ResponseInfo‬ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ‪.‬‬
‫اﻧﺘﻘﺎل دادﻩ ﺑﺼﻮرت ﺁﺳﻨﮑﺮون ‪ :‬ﮐﻨﺘﺮل ‪ IT‬ﻣﺘﺪهﺎي اﻧﻌﻄﺎف ﭘﺬﻳﺮ دﻳﮕﺮي هﻢ دارد ﮐﻪ ﺁﺳﻨﮑﺮون هﺴﺘﻨﺪ و اﺟﺎزﻩ ﻣﻲ دهﻨﺪ ﺗﺎ‬
‫هﻤﺰﻣﺎن ﺑﺎ ﻋﻤﻠﻴﺎت اﻧﺘﻘﺎل دادﻩ ‪ ،‬ﺑﺮﻧﺎﻣﻪ ﺑﻪ وﻇﺎﻳﻒ دﻳﮕﺮي هﻢ ﺑﭙﺮدازد ‪ .‬اﻳﻦ ﻣﺘﺪهﺎ ﺑﺎ اﺳﺘﻔﺎدﻩ از ‪ Event Driven Model‬ﮐﺎر‬
‫ﻣﻲ ﮐﻨﻨﺪ ‪ .‬ﺑﺪﻳﻦ ﻣﻌﻨﻲ ﮐﻪ وﻗﺘﻲ ﺑﺮﻧﺎﻣﻪ درﺧﻮاﺳﺖ اﻧﺘﻘﺎل دادﻩ اي را ﻣﻲ دهﺪ ﮐﻨﺘﺮل ‪ IT‬درﺧﻮاﺳﺖ را در زﻣﻴﻨﻪ ﺑﺮﻧﺎﻣﻪ اﻧﺠﺎم‬
‫ﻣﻲ دهﺪ و ﺑﺮﻧﺎﻣﻪ ازاد اﺳﺖ ﺗﺎ ﺑﻪ ﮐﺎرهﺎي دﻳﮕﺮش ﺑﭙﺮدازد ‪ .‬زﻣﺎﻧﻴﮑﻪ دادﻩ هﺎ ﺑﺎزﻳﺎﺑﻲ ﺷﻮد ‪ ،‬دادﻩ هﺎ را از ﺑﺎﻓﺮ داﺧﻠﻲ ﮐﻨﺘﺮل‬
‫‪ IT‬ﻣﻲ ﺧﻮاﻧﺪ ‪.‬‬
‫ﻣﺘﺪ ‪ : GetChunk‬در ﻋﻤﻠﻴﺎت اﻧﺘﻘﺎل ﺁﺳﻨﮑﺮون ‪ ،‬ﺑﺎﻳﺴﺘﻲ دادﻩ را ﺗﻮﺳﻂ اﻳﻦ ﻣﺘﺪ از ﺑﺎﻓﺮ داﺧﻠﻲ ﮐﻨﺘﺮل ‪ IT‬ﺑﮕﻴﺮﻳﻢ ‪:‬‬

‫‪Inet.GetChunk(datasize[,datatype])x‬‬

‫ﮐﻪ ﭘﺎراﻣﺘﺮ ‪ datasize‬از ﻧﻮع ‪ long‬ﺑﻮدﻩ و ﺗﻌﻴﻴﻦ ﻣﻲ ﮐﻨﺪ ﭼﻨﺪ ﺑﺎﻳﺖ از ﺑﺎﻓﺮ ﺧﻮاﻧﺪﻩ ﺷﻮد و ﭘﺎراﻣﺘﺮ اﺧﺘﻴﺎري ‪ datatype‬ﻧﻮع دادﻩ را‬
‫ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ و ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ‪ icString‬و ‪ icByteArray‬را ﺑﮕﻴﺮد ‪.‬‬
‫زﻣﺎﻧﻴﮑﻪ ‪ StateChanged‬وارد ﺣﺎﻟﺘﻬﺎي ‪ icResponseReceived‬و ﻳﺎ ‪ icResponseCompleted‬ﺷﺪ ﺑﺎﻳﺪ از ‪ GetChunk‬اﺳﺘﻔﺎدﻩ‬
‫ﮐﻨﻴﺪ ‪ .‬ﺑﺪﻳﻦ ﺻﻮرت ﮐﻪ از ﻳﮏ ﺣﻠﻘﻪ اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﻴﻢ ﺗﺎ ﮐﻞ ﺑﺎﻓﺮ را ﺑﺨﻮاﻧﻴﻢ ‪:‬‬

‫‪Integer)x Private Sub Inet_StateChanged(Byval State as‬‬


‫‪Dim temp1,temp2‬‬
‫‪Select Case State‬‬
‫‪icResponseCompleted Case‬‬
‫‪temp1=””x‬‬
‫‪temp2=””x‬‬
‫‪Do‬‬
‫‪temp1=Inet.GetChunk(512,icString)x‬‬
‫‪temp1 & temp2=temp2‬‬
‫‪Loop Until temp1=””x‬‬
‫‪End Select‬‬
‫‪End Sub‬‬

‫ﺑﺮاي ﺑﺎﻻﺑﺮدن ﮐﺎراﻳﻲ ‪ ،‬ﺑﻬﺘﺮ اﺳﺖ از ﻗﻄﻌﺎت ﮐﻮﭼﮏ ) ﺑﻴﻦ ‪ 512‬ﺗﺎ ‪ 1024‬ﺑﺎﻳﺘﻲ ( اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ ‪.‬‬
‫ﻣﺘﺪ ‪ : Execute‬و اﻣﺎ اﻧﻌﻄﺎف ﭘﺬﻳﺮﺗﺮﻳﻦ ﻣﺘﺪ ﮐﻨﺘﺮل ‪ ، IT‬ﻣﺘﺪ ‪ Execute‬اﺳﺖ ‪ .‬ﻓﺮﻣﺖ ﮐﻠﻲ اﻳﻦ ﻣﺘﺪ ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪Inet.Execute(url,Command,Data,RequestHeaders)x‬‬

‫ﮐﻪ ‪ url‬ﺁدرس ﻣﻘﺼﺪ ‪ Command ،‬ﻓﺮﻣﺎﻧﻲ اﺳﺖ ﮐﻪ ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ دادﻩ ﻣﻲ ﺷﻮد و ‪ Data‬و ‪ RequestHeaders‬اﻃﻼﻋﺎت‬
‫اﺿﺎﻓﻲ ﻻزم ﺑﺮاي اﺟﺮاي ﻓﺮﻣﺎن دادﻩ ﺷﺪﻩ اﺳﺖ ‪ .‬ﻓﺮﻣﺎﻧﻬﺎي ‪ Command‬هﻤﺎن ﻓﺮﻣﺎﻧﻬﺎي ‪ HTTP‬هﺴﺘﻨﺪ ﮐﻪ ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ : GET -‬درﻳﺎﻓﺖ دادﻩ هﺎ از ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ‬
‫‪ : HEAD -‬درﻳﺎﻓﺖ اﻃﻼﻋﺎت ‪ header‬از ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ‬
‫‪ : POST -‬ارﺳﺎل اﻃﻼﻋﺎت ﻻزم ﺑﺮاي ﺗﮑﻤﻴﻞ درﺧﻮاﺳﺖ‬
‫‪ : PUT -‬ارﺳﺎل ﻓﺎﻳﻞ ﺑﺮاي ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻴﺰﺑﺎن ) ‪( upload‬‬
‫ﻓﺮﻣﺎن ‪ GET‬ﭘﺮﮐﺎرﺑﺮدﺗﺮﻳﻦ ﻓﺮﻣﺎن ﻣﺘﺪ ‪ Execute‬اﺳﺖ و دادﻩ هﺎي ﺧﻮاﻧﺪﻩ ﺷﺪﻩ را در ﺑﺎﻓﺮ داﺧﻠﻲ ﺑﺎﻓﺮ ﮐﻨﺘﺮل ‪ IT‬ﻗﺮار ﻣﻲ دهﺪ‬
‫ﺗﺎ ﺑﺘﻮان ﺑﺎ ﻣﺘﺪ ‪ GetChunk‬ﺁﻧﻬﺎ را ﺑﺎزﻳﺎﺑﻲ ﻧﻤﻮد ‪.‬‬
‫ﻣﺜﺎل ‪:‬‬

‫‪Inet.Execute http://www.microsoft.com,”GET”x‬‬

‫ﺳﺎﻳﺮ ﺧﻮاص ﮐﻨﺘﺮل‪: IT‬‬


‫‪ : AccessType -‬ﻧﻮع دﺳﺘﺮﺳﻲ ﮐﻨﺘﺮل ‪ IT‬ﺑﻪ اﻳﻨﺘﺮﻧﺖ را ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ و ﺳﻪ ﻣﻘﺪار ﻣﻲ ﺗﻮاﻧﺪ ﺑﮕﻴﺮد ‪:‬‬
‫‪ : icUseDefault‬اﺳﺘﻔﺎدﻩ از ﺗﻨﻈﻴﻤﺎت رﺟﻴﺴﺘﺮي ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻨﺘﺮﻧﺖ‬
‫‪ : icDirect‬اﺗﺼﺎل ﻣﺴﺘﻘﻴﻢ ﮐﻨﺘﺮل ‪ IT‬ﺑﻪ اﻳﻨﺘﺮﻧﺖ‬
‫‪ : icNamedProxy‬اﺗﺼﺎل ﺑﻪ اﻳﻨﺘﺮﻧﺖ ﺗﻮﺳﻂ ﭘﺮوﮐﺴﻲ‬
‫‪ : Document -‬ﻧﺎم ﺻﻔﺤﻪ ﭘﻴﺶ ﻓﺮض ﮐﻪ در ﻣﺘﺪ ‪ Execute‬از ﺁن اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪ .‬اﮔﺮ ﺑﻪ ﻣﺘﺪ ‪ Execute‬ﭘﺎراﻣﺘﺮ ‪ url‬را‬
‫ﻧﺪهﻴﺪ از اﻳﻦ ﺻﻔﺤﻪ ﭘﻴﺶ ﻓﺮض اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫‪ : Password -‬ﮐﻠﻤﻪ رﻣﺰ ﻋﺒﻮر ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻴﺰﺑﺎن ‪FTP‬‬
‫‪ : Procotol -‬ﻧﻮع ﭘﺮوﺗﮑﻞ ﻣﻮرد اﺳﺘﻔﺎدﻩ در ﻣﺘﺪ ‪ Execute‬را ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ و ‪ 5‬ﻣﻘﺪار ﻣﻲ ﺗﻮاﻧﺪ ﺑﮕﻴﺮد ‪:‬‬
‫‪ : icUnknown‬ﻧﺎﻣﻌﻠﻮم‬
‫‪ : icDefault‬ﭘﺮوﺗﮑﻞ ﭘﻴﺶ ﻓﺮض‬
‫‪ : icFTP‬ﭘﺮوﺗﮑﻞ ‪FTP‬‬
‫‪ : icHTTP‬ﭘﺮوﺗﮑﻞ ‪HTTP‬‬
‫‪ : icHTTP‬ﭘﺮوﺗﮑﻞ ﺣﻔﺎﻇﺖ ﺷﺪﻩ ‪HTTP‬‬
‫‪ : Proxy -‬ﻧﺎم ﻣﻴﺰﺑﺎن ﭘﺮوﮐﺴﻲ‬
‫‪ : RequestTimeOut -‬ﻣﺪت زﻣﺎﻧﻲ ﮐﻪ ﮐﻨﺘﺮل ‪ IT‬ﺻﺒﺮ ﻣﻲ ﮐﻨﺪ ﺗﺎ اﻃﻼﻋﺎت را درﻳﺎﻓﺖ ﮐﻨﺪ ‪ .‬اﮔﺮ اﻳﻦ ﺧﺎﺻﻴﺖ ﺻﻔﺮ ﺑﺎﺷﺪ ﮐﻨﺘﺮل‬
‫ﺗﺎ هﺮ زﻣﺎن ﮐﻪ ﻻزم ﺑﺎﺷﺪ ﺑﺮاي درﻳﺎﻓﺖ ﭘﺎﺳﺦ ﺻﺒﺮ ﻣﻲ ﮐﻨﺪ ‪ .‬در ﺣﺎﻟﺖ ﺳﻨﮑﺮون ) ﻣﺘﺪ ‪ ( OpenURL‬ﺑﻌﺪ از ﺳﭙﺮي ﺷﺪن اﻳﻦ‬
‫ﻣﺪت زﻣﺎن ‪ ،‬ﻳﮏ ﺧﻄﺎ ﺗﻮﻟﻴﺪ ﻣﻲ ﺷﻮد و در ﺣﺎﻟﺖ ﺁﺳﻨﮑﺮون ) ﻣﺘﺪ ‪ ( Execute‬روﻳﺪاد ‪ StateChanged‬ﻣﻘﺪار ﺧﻄﺎ را ﺑﺮ ﻣﻲ‬
‫ﮔﺮداﻧﺪ‬
‫‪ : ResponseCode -‬ﺑﻌﺪ از ﺑﺮوز ﺣﺎﻟﺖ ‪ icError‬اﻳﻦ ﺧﺎﺻﻴﺖ ﮐﺪ ﺧﻄﺎ را ﻣﻲ دهﺪ ‪.‬‬
‫‪ : ResponseInfo -‬ﺗﻮﺿﻴﺤﻲ درﺑﺎرﻩ ﺧﻄﺎ‬
‫‪ : StillExecuting -‬اﮔﺮ ‪ True‬ﺑﺎﺷﺪ ﻳﻌﻨﻲ ﮐﻨﺘﺮل ﻣﺸﻐﻮل اﻧﺠﺎم ﮐﺎر اﺳﺖ ‪.‬‬
‫‪ : URL -‬ﺁدرس ﻣﻘﺼﺪ در ﻣﺘﺪهﺎي ‪ OpenURL‬و ﻳﺎ ‪Execute‬‬
‫‪ : UserName -‬ﻧﺎم ﮐﺎرﺑﺮ ﺑﺮاي ورود ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻴﺰﺑﺎن ‪FTP‬‬

‫ﮐﻨﺘﺮل ‪ - Internet Transfer‬ﻗﺴﻤﺖ دوم‬

‫اﺗﺼﺎﻻت ‪FTP‬‬

‫ﭘﺮوﺗﮑﻞ ‪ FTP‬ﻋﻼوﻩ ﺑﺮ ﻧﻘﻞ و اﻧﺘﻘﺎل ﻓﺎﻳﻞ ﺑﻴﻦ دو ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ ،‬ﻣﻲ ﺗﻮاﻧﺪ ﻧﻮﻋﻲ ﻣﺪﻳﺮﻳﺖ ﻓﺎﻳﻞ ) ﻣﺜﻞ ﺣﺬف ﻓﺎﻳﻞ ﻳﺎ اﻳﺠﺎد ﭘﻮﺷﻪ (‬
‫روي ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ را اﻧﺠﺎم دهﺪ ‪ FTP .‬در اﻧﺘﻘﺎل ﻓﺎﻳﻞ ﺑﺴﻴﺎر ﻗﻮﻳﺘﺮ از ‪ HTTP‬اﺳﺖ وﻟﻲ ﺑﻪ ﻣﺮاﺗﺐ ﭘﻴﭽﻴﺪﻩ ﺗﺮ از ‪ HTTP‬ﻣﻲ‬
‫ﺑﺎﺷﺪ اﻣﺎ ﮐﻨﺘﺮل ‪ IT‬اﻳﻦ ﭘﻴﭽﻴﺪﮔﻴﻬﺎ را از دﻳﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﺨﻔﻲ ﮐﺮدﻩ اﺳﺖ ‪.‬‬
‫ﺑﺮاي ﮐﺎر ﺑﺎ ﺳﺮورهﺎي ‪ FTP‬ﺑﺎﻳﺪ ﺑﻪ ﺁﻧﻬﺎ ‪ Login‬ﻧﻤﻮد ‪ .‬ﻧﻮع ﺧﺎﺻﻲ از ‪ Login‬ﺑﻪ ﻧﺎم ‪ ) Anonymous Login‬ورود ﻧﺎﺷﻨﺎس (‬
‫وﺟﻮد دارد ﮐﻪ ﺑﺎ ﺁن ﮐﺎرﺑﺮان ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺪون ﻣﺤﺪودﻳﺖ از ﺳﺎﻳﺖ ‪ FTP‬اﺳﺘﻔﺎدﻩ ﮐﻨﻨﺪ ‪ .‬ﺗﻮﺟﻪ ﮐﻨﻴﺪ ﮐﻪ ﺣﺘﻲ ﺑﺮاي ورود‬
‫ﻧﺎﺷﻨﺎس هﻢ ﻧﻴﺎز ﺑﻪ ﻧﺎم ﮐﺎرﺑﺮ و ﮐﻠﻤﻪ ﻋﺒﻮر اﺳﺖ ‪ .‬ﺑﺮاي ارﺳﺎل ﻧﺎم ﮐﺎرﺑﺮ و ﮐﻠﻤﻪ ﻋﺒﻮر از ﺧﻮاص ‪ username‬و ‪password‬‬
‫ﮐﻨﺘﺮل ‪ IT‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪ .‬اﮔﺮ ﺧﺎﺻﻴﺖ ‪ username‬ﺧﺎﻟﻲ ﺑﺎﺷﺪ ) ‪ ، ( blank‬ﮐﻨﺘﺮل ‪ IT‬ﺑﻄﻮر ﺧﻮدﮐﺎر از ‪anonymous‬‬
‫اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﺪ و ﺁدرس ‪ email‬ﮐﺎرﺑﺮ ﺑﻌﻨﻮان ‪ passowrd‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪.‬‬
‫اﺳﺘﻔﺎدﻩ از ﻣﺘﺪ ‪ : OpenURL‬ﻣﺘﺪ ‪ OpenURL‬ﺳﺎدﻩ ﺗﺮﻳﻦ راﻩ اﻧﺠﺎم ﻋﻤﻠﻴﺎت ‪ FTP‬اﺳﺖ ‪ .‬دﺳﺘﻮر زﻳﺮ از ﻳﮏ ﺳﺎﻳﺖ ‪ FTP‬ﻟﻴﺴﺖ‬
‫ﻣﻲ ﮔﻴﺮد ‪:‬‬

‫‪Text.text=Inet.OpenURL("ftp://ftp.microsoft.com",icString)x‬‬

‫ﺑﺮاي ﺧﻮاﻧﺪن ﻓﺎﻳﻞ از ﻳﮏ ﺳﺎﻳﺖ ‪ FTP‬ﺑﺎﻳﺪ در ﺣﺎﻟﺖ ﺑﺎﻳﻨﺮي ﮐﺎر ﮐﺮد ‪:‬‬

‫‪b()=Inet.OpenURL("ftp://ftp.microsft.com/test.zip",icByteArray)x‬‬

‫اﺳﺘﻔﺎدﻩ از ﻣﺘﺪ ‪ : Execute‬ﻣﺘﺪ ‪ Execute‬ﻗﺎﺑﻠﻴﺘﻬﺎي ﺑﻴﺸﺘﺮي دارد و اﺟﺮای ﺁن در ‪ FTP‬ﻧﻴﺎز ﺑﻪ دو ﭘﺎراﻣﺘﺮ دارد ‪:‬‬

‫‪Inet.Execute(url,operation)x‬‬
‫ﮐﻪ ‪ url‬ﺁدرس ﺳﺎﻳﺖ ‪ FTP‬ﺑﻬﻤﺮاﻩ ﻧﺎم و ﻣﺴﻴﺮ ﻓﺎﻳﻞ و ﭘﺎراﻣﺘﺮ ‪ operation‬ﻳﮏ ﻓﺮﻣﺎن ‪ FTP‬اﺳﺖ ‪ .‬ﮐﻨﺘﺮل ‪ IT‬ﺑﺎ دادﻩ هﺎي ﺧﻮاﻧﺪﻩ‬
‫ﺷﺪﻩ ‪ FTP‬ﺑﻪ دو ﻃﺮﻳﻖ رﻓﺘﺎر ﻣﻲ ﮐﻨﺪ ‪:‬‬
‫ﺑﺮﺧﻲ از دادﻩ هﺎ ﻣﺜﻞ ﭘﺎﺳﺦ ﻓﺮﻣﺎن ‪ DIR‬در ﺑﺎﻓﺮ ﮐﻨﺘﺮل ‪ IT‬ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﺑﺎﻳﺪ ﺁﻧﻬﺎ را ﺑﺎ ﻣﺘﺪ ‪ GetChunk‬ﺧﻮاﻧﺪ ‪.‬‬
‫ﺑﺮﺧﻲ دﻳﮕﺮ از دادﻩ هﺎ ﻣﺜﻞ ﻓﺎﻳﻞ ﺧﻮاﻧﺪﻩ ﺷﺪﻩ ﺑﺎ ﻓﺮﻣﺎن ‪ GET‬ﻣﺴﺘﻘﻴﻤﺎً روي دﻳﺴﮏ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ و دﻳﮕﺮ ﻧﻴﺎزي ﺑﻪ‬
‫اﺳﺘﻔﺎدﻩ از ﻣﺘﺪ ‪ GetChunk‬ﻧﻴﺴﺖ ‪.‬‬
‫ﻓﺮاﻣﻴﻦ ‪ FTP‬ﺑﺴﻴﺎر ﻗﻮي هﺴﺘﻨﺪ و ﺣﺘﻲ ﺑﻪ ﺷﻤﺎ اﻳﻦ اﻣﮑﺎن را ﻣﻲ دهﻨﺪ ﮐﻪ ﻓﺎﻳﻠﻬﺎ را ﺑﻪ روي ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﮐﭙﻲ ﮐﻨﻴﺪ ‪ ،‬ﺑﻪ‬
‫ﭘﻮﺷﻪ هﺎي ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﺑﺮوﻳﺪ ‪ ،‬ﻓﺎﻳﻠﻬﺎ را ﺣﺬف ﮐﻨﻴﺪ و ﻳﺎ ﺗﻐﻴﻴﺮ ﻧﺎم دهﻴﺪ ‪ .‬اﻟﺒﺘﻪ ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﮐﻪ ﻓﺮاﻣﻴﻦ ﻗﺎﺑﻞ اﺟﺮا ﺑﻪ‬
‫ﻧﻮع ورود ﺑﻪ ﺳﻴﺴﺘﻢ ‪ FTP‬ﺑﺴﺘﮕﻲ دارد ‪ .‬اﮔﺮ ﺑﺎ ﮐﺎرﺑﺮ ‪ anonymous‬ﺑﻪ ﻳﮏ ﺳﺎﻳﺖ ‪ FTP‬وارد ﺷﻮﻳﺪ ﺗﻨﻬﺎ ﻣﻲ ﺗﻮاﻧﺪ ﻓﺎﻳﻠﻬﺎ را‬
‫ﺑﺒﻴﻨﺪ و ﺁﻧﻬﺎ را ‪ download‬ﮐﻨﻴﺪ ‪.‬‬
‫ﻣﻬﻤﺘﺮﻳﻦ ﻓﺮاﻣﻴﻦ ‪ FTP‬ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ : CD path‬ﺑﻪ داﻳﺮﮐﺘﻮري ‪ path‬ﻣﻲ روﻳﺪ ‪.‬‬
‫‪ : CDUP‬ﺑﻪ ﻳﮏ داﻳﺮﮐﺘﻮري ﺑﺎﻻﺗﺮ ﻣﻲ رود ‪.‬‬
‫‪ : CLOSE‬ﺑﺴﺘﻦ اﺗﺼﺎل ‪FTP‬‬
‫‪ : DELETE file1‬ﺣﺬف ﻓﺎﻳﻞ ‪file1‬‬
‫‪ : DIR file1‬ﺟﺴﺘﺠﻮي ﻓﺎﻳﻞ ‪ file1‬روي داﻳﺮﮐﺘﻮري ﺟﺎري‬
‫‪ : MKDIR path‬اﻳﺠﺎد ﻳﮏ داﻳﺮﮐﺘﻮري ﺑﺎ ﻧﺎم ‪path‬‬
‫‪ : PUT file1 file2‬ﻓﺎﻳﻞ ‪ file1‬را از ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﺒﺪا روي ﻓﺎﻳﻞ ‪ file2‬در ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﮐﭙﻲ ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫‪ : PWD‬ﻧﺎم داﻳﺮﮐﺘﻮري ﺟﺎري در ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ‪.‬‬
‫‪ : QUIT‬ﻗﻄﻊ اﺗﺼﺎل ‪FTP‬‬
‫‪ : GET file1 file2‬ﻓﺎﻳﻞ ‪ file1‬را از ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ روي ﻓﺎﻳﻞ ‪ file2‬در ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﺒﺪا ﮐﭙﻲ ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫‪ : file2 RENAME file1‬ﺗﻐﻴﻴﺮ ﻧﺎم ﻓﺎﻳﻞ ‪ file1‬ﺑﻪ ‪file2‬‬
‫‪ : RMDIR path‬ﺣﺬف داﻳﺮﮐﺘﻮري ‪ path‬در ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ‬
‫‪ : SIZE file1‬ﺑﺪﺳﺖ ﺁوردن ﺗﻌﺪاد ﺑﺎﻳﺘﻬﺎي ﻓﺎﻳﻞ ﻳﺎ داﻳﺮﮐﺘﻮري ‪file1‬‬
‫ﻣﺜﺎل ‪:‬‬

‫‪test.zip")x Inet.Execute("ftp://ftp.microsoft.com","GET‬‬
‫ﮐﻨﺘﺮل ‪ - WinSock‬ﻗﺴﻤﺖ اول‬

‫ﻣﻘﺪﻣﻪ ‪:‬‬
‫ﮐﻨﺘﺮل ‪ WinSock‬ﻧﺴﺒﺖ ﺑﻪ ﺗﻤﺎم ﮐﻨﺘﺮﻟﻬﺎي اﻳﻨﺘﺮﻧﺖ در ﺳﻄﺢ ﭘﺎﻳﻴﻨﺘﺮي ﻗﺮار دارد ‪ .‬اﻳﻦ ﮐﻨﺘﺮل اﻣﮑﺎن اﻳﺠﺎد ﺳﺮوﻳﺴﻬﺎي ﺷﺒﮑﻪ‬
‫اي ﻣﺒﺘﻨﻲ ﺑﺮ ﭘﺮوﺗﮑﻠﻬﺎي ‪ TCP‬و ‪ UDP‬را ﻣﻬﻴﺎ ﻣﻲ ﮐﻨﺪ ‪ .‬ﺑﻌﺒﺎرت دﻳﮕﺮ ﺗﻮﺳﻂ اﻳﻦ ﮐﻨﺘﺮل ﻣﻲ ﺗﻮان ﺑﺮﻧﺎﻣﻪ هﺎي ﮐﺎرﺑﺮدي‬
‫‪ ) Client/Server‬ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪﻩ ‪ /‬ﺳﺮوﻳﺲ دهﻨﺪﻩ ( اﻳﺠﺎد و ﺑﺎ اﺳﺘﻔﺎدﻩ از ﭘﺮوﺗﮑﻞ ‪ TCP‬و ﻳﺎ ‪ UDP‬ﺑﻴﻦ ﺁﻧﻬﺎ ارﺗﺒﺎط ﺑﺮﻗﺮار ﻧﻤﻮد‬
‫‪.‬‬
‫ﺑﺎ ﺗﻨﻈﻴﻢ ﺧﺼﻮﺻﻴﺎت و ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪهﺎي اﻳﻦ ﮐﻨﺘﺮل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ راﺣﺘﻲ ﺑﻪ ﻳﮏ ﮐﺎﻣﭙﻴﻮﺗﺮ راﻩ دور ﻣﺘﺼﻞ ﺷﻮﻳﺪ و دادﻩ هﺎ را‬
‫در هﺮ دو ﺟﻬﺖ ﺟﺎﺑﺠﺎ ﻧﻤﺎﺋﻴﺪ ‪ .‬ﻧﻤﻮﻧﻪ ﮐﺎرﺑﺮهﺎﻳﻲ ﮐﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﻳﻦ ﮐﻨﺘﺮل اﻳﺠﺎد ﻧﻤﻮد ‪:‬‬
‫‪ ، Port Scanner ،Game Network ،Proxy Server ،Mail server ،Mail client ،Client-server chat‬ﭘﻴﺎدﻩ ﺳﺎزي‬
‫اﻟﮕﻮرﻳﺘﻢ هﺎي ﻣﻮازي و …‬
‫ﻣﺒﺎﻧﻲ ‪: TCP‬‬
‫ﭘﺮوﺗﮑﻞ ﮐﻨﺘﺮل اﻳﻨﺘﺮﻧﺖ ) ‪ ( Transfer Control Protocol‬اﺟﺎزﻩ ﻣﻲ دهﺪ ﻳﮏ اﺗﺼﺎل ) ‪ ( Connection‬را از ﻃﺮﻳﻖ ﺳﻮﮐﺖ )‬
‫‪ ( socket‬ﺑﻪ ﻳﮏ ﮐﺎﻣﭙﻴﻮﺗﺮ راﻩ دور ) ‪ ( Computer Remote‬ﺳﺎﺧﺘﻪ و اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ ‪ .‬ﺑﺎ اﺳﺘﻔﺎدﻩ از اﻳﻦ اﺗﺼﺎل ‪ ،‬هﺮ دو‬
‫ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻲ ﺗﻮاﻧﻨﺪ دادﻩ هﺎ را ﺑﻴﻦ ﺧﻮدﺷﺎن اﻧﺘﻘﺎل دهﻨﺪ ‪ .‬ﺑﺮﻗﺮاري ارﺗﺒﺎط از ﻃﺮﻳﻖ ‪ TCP‬هﻤﺎﻧﻨﺪ ﺻﺤﺒﺖ ﮐﺮدن ﺑﺎ ﺗﻠﻔﻦ اﺳﺖ‬
‫ﮐﻪ ﺑﺎﻳﺪ ﺣﺘﻤﺎً اﺗﺼﺎﻟﻲ ﺑﻴﻦ دو ﮐﺎﻣﭙﻴﻮﺗﺮ ﺻﻮرت ﮔﻴﺮد ﺗﺎ ﺑﺘﻮاﻧﻨﺪ ﺑﺎ هﻢ ارﺗﺒﺎط ﺑﺮﻗﺮار ﮐﻨﻨﺪ ‪.‬‬
‫اﮔﺮ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ‪ Client‬ﻣﻲ ﺳﺎزﻳﺪ ﺑﺎﻳﺴﺘﻲ ﺑﺪاﻧﻴﺪ ﮐﻪ ﻧﺎم ﻳﺎ ﺁدرس ‪ IP‬ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ Server‬ﭼﻴﺴﺖ ) ‪ ( Remote Host IP‬و‬
‫هﻤﭽﻨﻴﻦ از ﻃﺮﻳﻖ ﭼﻪ ﭘﻮرﺗﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺁن ﻣﺘﺼﻞ ﺷﻮﻳﺪ ) ‪ . ( Remote Port‬ﺣﺎل ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﺁن ﭘﻮرت ‪ Connect‬ﮐﻨﻴﺪ ‪.‬‬
‫هﻤﭽﻨﻴﻦ اﮔﺮ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ‪ Server‬ﻣﻲ ﺳﺎزﻳﺪ ﺑﺎﻳﺴﺘﻲ ﭘﻮرﺗﻲ را ﮐﻪ روي ﺁن ﺑﻪ درﺧﻮاﺳﺘﻬﺎ ﮔﻮش ﻣﻲ دهﻴﺪ ﻣﺸﺨﺺ ﮐﻨﻴﺪ )‬
‫‪ ( LocalPort‬و ﺳﭙﺲ ﺑﻪ ﭘﻮرت ﮔﻮش دهﻴﺪ ) ‪. ( Listen‬‬
‫زﻣﺎﻧﻴﮑﻪ ﻳﮏ ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ Client‬ﺗﻘﺎﺿﺎي ﻳﮏ اﺗﺼﺎل را ﻣﻲ دهﺪ ‪ Server‬اﻳﻦ درﺧﻮاﺳﺖ را ‪ Accept‬ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫زﻣﺎﻧﻴﮑﻪ ﻳﮏ اﺗﺼﺎل ﺳﺎﺧﺘﻪ ﻣﻲ ﺷﻮد ‪ ،‬هﺮ دو ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻲ ﺗﻮاﻧﻨﺪ دادﻩ را ﻓﺮﺳﺘﺎدﻩ و درﻳﺎﻓﺖ ﮐﻨﻨﺪ ‪.‬‬

‫ﻣﺒﺎﻧﻲ ‪: UDP‬‬
‫ﭘﺮوﺗﮑﻞ دﻳﺘﺎﮔﺮام ﮐﺎرﺑﺮ ) ‪ ( User Datagram Protocol‬ﭘﺮوﺗﮑﻠﻲ ﺑﺪون اﺗﺼﺎل ) ‪ ( Connectionless‬اﺳﺖ ‪ .‬ﺑﺮﺧﻼف ‪، TCP‬‬
‫ﮐﺎﻣﭙﻴﻮﺗﺮهﺎ ﻧﻴﺎز ﺑﻪ ﺑﺮﭘﺎ ﮐﺮدن ﻳﮏ اﺗﺼﺎل ﻧﺪارﻧﺪ ﺑﻨﺎﺑﺮاﻳﻦ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﺪ ﻳﮏ ‪ client‬و ﻳﺎ ﻳﮏ ‪ server‬ﺑﺎﺷﺪ ‪ .‬ﺑﺮﻗﺮاري ارﺗﺒﺎط‬
‫در ‪ UDP‬ﺷﺒﻴﻪ ارﺳﺎل ﻧﺎﻣﻪ از ﻃﺮﻳﻖ ﭘﺴﺖ اﺳﺖ ‪.‬‬
‫ﺑﺮاي اﻧﺘﻘﺎل دادﻩ ﺗﻮﺳﻂ ‪ UDP‬اﺑﺘﺪا ﺑﺎﻳﺪ ‪ Local Port‬ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ Client‬ﺗﻨﻈﻴﻢ ﮔﺮدد ‪ .‬ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ Server‬ﺗﻨﻬﺎ ﺑﺎﻳﺴﺘﻲ‬
‫‪ RemoteHost‬را ﺑﺮاﺑﺮ ﺁدرس ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ Client‬ﻗﺮار دهﺪ و هﻤﭽﻨﻴﻦ ‪ Remote Port‬را هﻤﺎن ‪ Local Port‬ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ Client‬ﻗﺮار‬
‫دهﺪ ‪ .‬ﺳﭙﺲ دو ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻲ ﺗﻮاﻧﻨﺪ دادﻩ هﺎ را ﺑﻴﻦ ﺧﻮد ﺟﺎﺑﺠﺎ ﮐﻨﻨﺪ ‪.‬‬
‫اﺳﺘﻔﺎدﻩ از ﮐﻨﺘﺮل ‪: WinSock‬‬

‫‪ – 1‬اﻧﺘﺨﺎب ﭘﺮوﺗﮑﻞ‪ :‬در زﻣﺎن اﺳﺘﻔﺎدﻩ از ﮐﻨﺘﺮل ‪ WinSock‬اوﻟﻴﻦ ﮐﺎري ﮐﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دهﻴﺪ اﻧﺘﺨﺎب ﻳﮑﻲ از ﭘﺮوﺗﮑﻠﻬﺎي ‪ TCP‬ﻳﺎ‬
‫‪ UDP‬اﺳﺖ ‪ .‬ﻃﺒﻴﻌﺖ ﺑﺮﻧﺎﻣﻪ اي ﮐﻪ ﺷﻤﺎ ﻣﻲ ﺳﺎزﻳﺪ ﻧﻮع ﭘﺮوﺗﮑﻠﻲ را ﮐﻪ ﺑﺎﻳﺪ اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ ‪ .‬ﭼﻨﺪ ﺳﻮال زﻳﺮ‬
‫ﺑﻪ ﺷﻤﺎ ﮐﻤﮏ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﭘﺮوﺗﮑﻞ ﻣﻮرد ﻧﻴﺎزﺗﺎن را اﻧﺘﺨﺎب ﮐﻨﻴﺪ ‪:‬‬
‫‪ -‬ﺁﻳﺎ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ در زﻣﺎﻧﻴﮑﻪ دادﻩ ﻓﺮﺳﺘﺎدﻩ ﻣﻲ ﺷﻮد ﻳﺎ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد ﻧﻴﺎز ﺑﻪ اﻃﻼﻋﺎﺗﻲ از ﻃﺮف ‪ Server‬ﻳﺎ ‪ Client‬دارد ؟‬
‫اﮔﺮ ﭼﻨﻴﻦ اﺳﺖ ﺑﺎﻳﺴﺘﻲ ﻳﮏ اﺗﺼﺎل ‪ TCP‬ﻗﺒﻞ از ارﺳﺎل ﻳﺎ درﻳﺎﻓﺖ دادﻩ اﻳﺠﺎد ﺷﻮد ‪.‬‬
‫‪ -‬ﺁﻳﺎ دادﻩ ﺑﺴﻴﺎر ﺑﺰرگ اﺳﺖ ) ﻣﺜﻞ ﺗﺼﻮﻳﺮ ﻳﺎ ﻓﺎﻳﻠﻬﺎي ﺻﻮﺗﻲ ( ؟ زﻣﺎﻧﻴﮑﻪ ﻳﮏ اﺗﺼﺎل ‪ TCP‬ﺳﺎﺧﺘﻪ ﻣﻲ ﺷﻮد ﭘﺮوﺗﮑﻞ ‪ TCP‬اﺗﺼﺎل‬
‫را ﺑﺎﻗﻲ ﻧﮕﻪ ﻣﻲ دارد و درﺳﺘﻲ ارﺳﺎل دادﻩ ﺗﻀﻤﻴﻦ ﺷﺪﻩ اﺳﺖ ‪ .‬اﻳﻦ اﺗﺼﺎل در هﺮ ﺣﺎل ﺑﻪ ﻣﻨﺎﺑﻊ ﻣﺤﺎﺳﺒﺎﺗﻲ ﺑﻴﺸﺘﺮي ﻧﻴﺎز‬
‫دارد و ﺑﻨﺎﺑﺮاﻳﻦ ﭘﺮهﺰﻳﻨﻪ ﺗﺮ اﺳﺖ ‪.‬‬
‫‪ -‬ﺁﻳﺎ دادﻩ ﻣﺘﻨﺎوب ارﺳﺎل ﻣﻲ ﺷﻮد ﻳﺎ در ﻳﮏ ﻧﺸﺴﺖ ) ‪ ( Session‬ارﺳﺎل ﺧﻮاهﺪ ﺷﺪ ؟ ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺷﻤﺎ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ﻣﻲ‬
‫ﺳﺎزﻳﺪ ﮐﻪ ﮐﺎﻣﭙﺘﺮهﺎي ﻣﺸﺨﺼﻲ را در ﻳﮏ زﻣﺎن ﺧﺎص از اﻧﺠﺎم ﺷﺪن ﻋﻤﻠﻴﺎﺗﻲ ﻣﻄﻠﻊ ﻣﻲ ﮐﻨﺪ ﭘﺮوﺗﮑﻞ ‪ UDP‬ﻣﻨﺎﺳﺐ ﺗﺮ اﺳﺖ ‪.‬‬
‫ﭘﺮوﺗﮑﻞ ‪ UDP‬هﻤﭽﻨﻴﻦ ﺑﺮاي ارﺳﺎل ﻣﻘﺎدﻳﺮ ﮐﻮﭼﮏ دادﻩ اي ﻣﻨﺎﺳﺖ ﺗﺮ ﻣﻲ ﺑﺎﺷﺪ ‪.‬‬
‫‪ – 2‬ﺗﻨﻈﻴﻢ ﭘﺮوﺗﮑﻞ ‪ :‬ﺑﺮاي ﺗﻨﻈﻴﻢ ﭘﺮوﺗﮑﻠﻲ ﮐﻪ ﻣﻲ ﺧﻮاهﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﺗﺎن از ﺁن اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ در زﻣﺎن ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﺧﺎﺻﻴﺖ‬
‫‪ Protocol‬ﮐﻨﺘﺮل ‪ WinSock‬را ﺑﺮاﺑﺮ ‪ sckTCPProtocol‬و ﻳﺎ ‪ sckUDPProtocol‬ﻗﺮار دهﻴﺪ ‪ .‬هﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ ﭘﺮوﺗﮑﻞ ﺧﻮد را‬
‫ﺗﻮﺳﻂ ﮐﺪ زﻳﺮ ﺗﻨﻈﻴﻢ ﮐﻨﻴﺪ ‪:‬‬

‫‪WinSock.Protocol=sckTCPProtocol‬‬

‫‪ – 3‬ﻣﺸﺨﺺ ﮐﺮدن ﻧﺎم ﮐﺎﻣﭙﻴﻮﺗﺎن ‪ :‬ﺑﺮاي اﺗﺼﺎل ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ راﻩ دور ﺑﺎﻳﺴﺘﻲ ﺁدرس ‪ IP‬و ﻳﺎ ﻧﺎم ﮐﺎﻣﭙﻮﺗﺮ را ﺑﺪاﻧﻴﺪ ‪.‬‬
‫ﻧﺎم ﮐﺎﻣﭙﻴﻮﺗﺮ در ‪ Control Panel/Network/Identification‬ﻣﻮﺟﻮد اﺳﺖ ‪ .‬در ﺻﻮرﺗﻴﮑﻪ ﻣﻲ ﺧﻮاهﻴﺪ دو ﺑﺮﻧﺎﻣﻪ ‪ Client‬و ‪Server‬‬
‫ﺧﻮد را روي ﻳﮏ ﮐﺎﻣﭙﻴﻮﺗﺮ ﺗﺴﺖ ﮐﻨﻴﺪ از ﺁدرس ‪ IP 127.0.0.1‬ﺑﺮاي هﺮ دو اﺳﺘﻔﺎدﻩ ﮐﻨﻴﺪ اﻣﺎ اﮔﺮ دو ﺑﺮﻧﺎﻣﻪ را روي دو ﮐﺎﻣﭙﻴﻮﺗﺮ‬
‫ﻣﺠﺰا در ﺷﺒﮑﻪ ﻗﺮار دادﻩ اﻳﺪ ﺑﺎ اﺟﺮاي دﺳﺘﻮر ‪ ipconfig‬در ‪ DOS Prompt‬ﻣﻲ ﺗﻮاﻧﻴﺪ ﺁدرس ‪ IP‬ﮐﺎﻣﭙﻴﻮﺗﺮ هﺎ را ﺑﺪﺳﺖ ﺁورﻳﺪ ‪.‬‬
‫‪ – 4‬اﻳﺠﺎد اﺗﺼﺎل ‪ : TCP‬در زﻣﺎن ﺳﺎﺧﺖ ﺑﺮﻧﺎﻣﻪ اي ﮐﻪ از ﭘﺮوﺗﮑﻞ ‪ TCP‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﺪ اﺑﺘﺪا ﺑﺎﻳﺪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮﻳﺪ ﮐﻪ اﻳﻦ‬
‫ﺑﺮﻧﺎﻣﻪ ‪ Client‬اﺳﺖ ﻳﺎ ‪ . Server‬ﺑﺮاي ﺳﺎﺧﺖ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ‪ Server‬ﺑﺎﻳﺴﺘﻲ روي ﻳﮏ ﭘﻮرت ﺧﺎص ‪ Listen‬ﮐﻨﻴﺪ ‪ .‬زﻣﺎﻧﻴﮑﻪ ‪Client‬‬
‫ﺗﻘﺎﺿﺎي ﻳﮏ اﺗﺼﺎل را ﻣﻲ دهﺪ ‪ ،‬ﺑﺮﻧﺎﻣﻪ ‪ Server‬ﻣﻲ ﺗﻮاﻧﺪ ﺁﻧﺮا ‪ Accept‬ﮐﻨﺪ و ﺑﻨﺎﺑﺮاﻳﻦ اﺗﺼﺎل ﮐﺎﻣﻞ ﺷﺪﻩ اﺳﺖ ‪ .‬ﺣﺎل ‪ Client‬و‬
‫‪ Server‬ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ هﻢ ارﺗﺒﺎط داﺷﺘﻪ ﺑﺎﺷﻨﺪ ‪.‬‬
‫ﻣﺮاﺣﻞ زﻳﺮ ﺳﺎﺧﺖ ﻳﮏ ﺳﺮور ﭼﺖ ﺳﺎدﻩ ﺑﺮ ﻣﺒﻨﺎي ‪ TCP‬را ﻧﺸﺎن ﻣﻲ دهﺪ ‪:‬‬
‫‪ -‬از ﻣﻨﻮي ‪ Project‬ﮔﺰﻳﻨﻪ ‪ Components‬را اﻧﺘﺨﺎب ﮐﻨﻴﺪ و در ﻟﻴﺴﺖ ‪ Component‬هﺎ ﻣﻮرد ‪ Microsoft WinSock 6.0‬را‬
‫اﻧﺘﺨﺎب ﮐﻨﻴﺪ ‪.‬‬
‫‪ -‬ﻳﮏ ﮐﻨﺘﺮل ‪ WinSock‬در ﻓﺮم ﺧﻮد ﻗﺮار دهﻴﺪ و ﻧﺎم ﺁﻧﺮا ‪ tcpserver‬ﺑﮕﺬارﻳﺪ‬
‫‪ -‬دو ‪ textbox‬ﺑﺎ ﻧﺎﻣﻬﺎي ‪ txtSendData‬و ‪ txtReceiveData‬و ﻧﻴﺰ ﻳﮏ دﮐﻤﻪ در ﻓﺮم ﻗﺮار دهﻴﺪ ‪.‬‬
‫‪ -‬ﮐﺪ زﻳﺮ را در روﻳﺪاد ‪ Form_Load‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪Tcpserver.LocalPort=1000‬‬
‫‪tcpserver.Listen‬‬

‫‪ -‬زﻣﺎﻧﻴﮑﻪ درﺧﻮاﺳﺘﻲ از ﻃﺮف ‪ Client‬ﻣﻲ ﺁﻳﺪ روﻳﺪاد ‪ ConnectionRequest‬اﺟﺮا ﻣﻲ ﺷﻮد ‪ .‬در اﻳﻦ روﻳﺪاد اﺑﺘﺪا ﺑﺎﻳﺪ ﭼﮏ ﮐﻨﻴﺪ‬
‫ﮐﻪ ﺣﺎﻟﺖ ﮐﻨﺘﺮل ﺑﺴﺘﻪ ﺑﺎﺷﺪ ‪ .‬اﮔﺮ ﭼﻨﻴﻦ ﻧﻴﺴﺖ اﺗﺼﺎل را ﻗﺒﻞ از ﭘﺬﻳﺮﻓﺘﻦ اﺗﺼﺎل ﺟﺪﻳﺪ ﺑﺒﻨﺪﻳﺪ ‪ .‬ﺳﭙﺲ ﺗﻘﺎﺿﺎ را ﺑﺮ اﺳﺎس‬
‫ﭘﺎراﻣﺘﺮ ‪ requestID‬ﻣﻲ ﭘﺬﻳﺮﻳﻢ ‪:‬‬

‫‪(requestID As Long Private Sub tcpserver_ConnectionRequest(ByVal‬‬


‫‪tcpserver.Close sckClosed Then <> If tcpserver.State‬‬
‫‪tcpserver.Accept requestID‬‬
‫‪End Sub‬‬

‫‪ -‬ﺣﺎل اﺗﺼﺎل ﺑﻴﻦ ‪ Client‬و ‪ Server‬ﺑﺮﻗﺮار ﺷﺪﻩ اﺳﺖ ‪ .‬ﮐﺪ زﻳﺮ را ﺑﺮاي ‪ event‬ﻣﺮﺑﻮط ﺑﻪ ﮐﻠﻴﮏ دﮐﻤﻪ ‪ Send‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪Tcpserver.SendData txtSendData.text‬‬

‫‪ -‬اﮔﺮ دادﻩ اي از ﻃﺮف ‪ Client‬ﺑﻴﺎﻳﺪ روﻳﺪاد ‪ DataArrival‬اﺟﺮا ﻣﻲ ﺷﻮد ‪ .‬ﮐﺪ زﻳﺮ را ﺑﺮاي اﻳﻦ روﻳﺪاد ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪(As Long Private Sub tcpserver_DataArrival(ByVal bytesTotal‬‬


‫‪Dim strData As String‬‬
‫‪strData tcpserver.GetData‬‬
‫‪txtReceiveData.Text = strData‬‬
‫‪End Sub‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي روﻳﺪاد ‪ Form_Unload‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪Tcpserver.Close‬‬

‫ﻣﺮاﺣﻞ ﺳﺎﺧﺖ ﻳﮏ ‪ TCP Client‬ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬


‫‪ -‬ﻳﮏ ﮐﻨﺘﺮل ‪ WinSock‬در ﻓﺮم ﻗﺮار دهﻴﺪ و ﻧﺎم ﺁﻧﺮا ‪ tcpclient‬ﺑﮕﺬارﻳﺪ ‪.‬‬
‫‪ -‬دو ‪ textbox‬ﺑﺎ ﻧﺎﻣﻬﺎي ‪ txtsend‬و ‪ txtreceive‬و ﻧﻴﺰ ﻳﮏ دﮐﻤﻪ ﺑﺎ ﻧﺎم ‪send‬در ﻓﺮم ﻗﺮار دهﻴﺪ ‪.‬‬
‫‪ -‬ﻳﮏ دﮐﻤﻪ ﺑﺎ ﻧﺎم ‪ connect‬در ﻓﺮم ﻗﺮار دهﻴﺪ ‪.‬‬
‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي ﻣﺘﺪ ‪ Form_Load‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪tcpclient.RemoteHost=”yourservername”x‬‬
‫‪tcpclient.RemotePort=1000‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي روﻳﺪاد ﮐﻠﻴﮏ ﺷﺪن دﮐﻤﻪ ‪ connect‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪tcpclient.Connect‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي روﻳﺪاد ﮐﻠﻴﮏ ﺷﺪن دﮐﻤﻪ ‪ send‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪tctclient.SendData txtsend.Text‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي روﻳﺪاد ‪ DataArrival‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪(As Long Private Sub tcpclient_DataArrival(ByVal bytesTotal‬‬


‫‪Dim strData As String‬‬
‫‪strData tcpclient.GetData‬‬
‫‪txtreceive.Text = strData‬‬
‫‪End Sub‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺎري روﻳﺪاد ‪ Form_Unload‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪Tcpclient.Close‬‬

‫ﮐﺪهﺎي ﻓﻮق ﻳﮏ ﺳﻴﺴﺘﻢ ‪ Client-Server‬ﺳﺎدﻩ را ﻧﺸﺎن ﻣﻲ دهﺪ ‪ .‬ﻓﺎﻳﻞ ‪ exe‬هﺮ دو ﺑﺮﻧﺎﻣﻪ را ﺑﺴﺎزﻳﺪ و ﺁﻧﻬﺎ را اﺟﺮا ﮐﻨﻴﺪ ﺗﺎ‬
‫ﺑﺘﻮاﻧﻴﺪ ﺳﻴﺴﺘﻢ ﺧﻮد را ﺗﺴﺖ ﮐﻨﻴﺪ ‪.‬‬
‫‪ – 5‬ﭘﺬﻳﺮﻓﺘﻦ ﺑﻴﺶ از ﻳﮏ ﺗﻘﺎﺿﺎي اﺗﺼﺎل ‪ Server :‬اي ﮐﻪ در ﺑﺎﻻ ﺳﺎﺧﺘﻪ ﺷﺪ ﺗﻨﻬﺎ ﻣﻲ ﺗﻮاﻧﺪ ﺗﻘﺎﺿﺎي ﻳﮏ اﺗﺼﺎل را ﺑﭙﺬﻳﺮد ‪ .‬ﺑﺎ‬
‫اﺳﺘﻔﺎدﻩ از اﻳﺠﺎد ﻳﮏ ﺁراﻳﻪ از ﮐﻨﺘﺮل ‪ WinSock‬ﻣﻲ ﺗﻮان ﭼﻨﺪﻳﻦ ﺗﻘﺎﺿﺎي اﺗﺼﺎل را ﭘﺬﻳﺮﻓﺖ ‪ .‬ﺑﺮاي اﻳﻨﮑﺎر ﮐﺎﻓﻲ اﺳﺖ ﻳﮏ ﮐﭙﻲ )‬
‫‪ ( instance‬از ﮐﻨﺘﺮل ﺑﺴﺎزﻳﻢ ) ﺑﺎ ﺗﻨﻈﻴﻢ ﺧﺎﺻﻴﺖ ‪ ( Index‬و ﻣﺘﺪ ‪ Accept‬را ﺑﺮاي ‪ instance‬ﺟﺪﻳﺪ ﺑﮑﺎر ﺑﺒﺮﻳﻢ ‪ .‬ﻓﺮض ﮐﻨﻴﺪ ﻳﮏ‬
‫ﮐﻨﺘﺮل ‪ WinSock‬ﺑﺎ ﻧﺎم ‪ sckServer‬در ﻓﺮم دارﻳﻢ ﮐﻪ ﺧﺎﺻﻴﺖ ‪ Index‬ﺁﻧﺮا ﺻﻔﺮ ﻗﺮار دادﻩ اﻳﻢ ‪ .‬هﻤﭽﻨﻴﻦ ﻳﮏ ﻣﺘﻐﻴﺮ ‪ intMax‬از‬
‫ﻧﻮع ‪ Long‬ﺗﻌﺮﻳﻒ ﻣﻲ ﮐﻨﻴﻢ ﮐﻪ ﺗﻌﺪاد اﺗﺼﺎﻻت هﻤﺰﻣﺎن ﺑﻪ ‪ Server‬را ﻧﮕﻪ ﻣﻲ دارد ‪ .‬در ‪ event‬ﻣﺮﺑﻮط ﺑﻪ ‪ Form_Load‬ﮐﺪ زﻳﺮ را‬
‫ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬
‫‪intMax=0‬‬
‫‪sckServer(0).LocalPort=1000‬‬
‫‪sckServer(0).Listen‬‬

‫هﺮ ﺑﺎر ﮐﻪ ﺗﻘﺎﺿﺎي ﻳﮏ اﺗﺼﺎل ﻣﻲ رﺳﺪ ﮐﺪ اﺑﺘﺪا ﺗﺴﺖ ﻣﻲ ﮐﻨﺪ ﮐﻪ ﻣﻘﺪار ‪ Index‬ﭼﻘﺪر اﺳﺖ ‪ .‬اﮔﺮ ﻣﻘﺪار ‪ Index‬ﺻﻔﺮ ﺑﺎﺷﺪ‬
‫ﻣﺘﻐﻴﺮ ‪ intMax‬ﻳﮑﻲ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ و از ‪ intMax‬ﺑﺮاي ﺳﺎﺧﺖ ﻳﮏ ‪ instance‬ﺟﺪﻳﺪ از ﮐﻨﺘﺮل اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪ .‬ﺣﺎل از اﻳﻦ‬
‫‪ instance‬ﺑﺮاي ﭘﺬﻳﺮﻓﺘﻦ ﺗﻘﺎﺿﺎي اﺗﺼﺎل اﺳﺘﻔﺎدﻩ ﻣﻲ ﮔﺮدد ‪ .‬ﺑﺮاي اﻳﻨﮑﺎر ﮐﺪ زﻳﺮ را ﺑﺮاي روﻳﺪاد ‪ ConnectionRequest‬ﺑﻨﻮﻳﺴﻴﺪ‬
‫‪:‬‬

‫‪(Integer, ByVal requestID As Long Private Sub sckServer_ConnectionRequest(Index As‬‬


‫‪If Index = 0 Then‬‬
‫‪1 + intmax = intmax‬‬
‫‪Load sckServer(intmax)x‬‬
‫‪0 = sckServer(intmax).LocalPort‬‬
‫‪sckServer(Index).Accept requestID‬‬
‫‪End If‬‬
‫‪End Sub‬‬

‫‪ – 6‬اﻳﺠﺎد اﺗﺼﺎل ‪ : UDP‬ﺳﺎﺧﺖ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ‪ UDP‬ﺳﺎدﻩ ﺗﺮ از ﺑﺮﻧﺎﻣﻪ هﺎي ‪ TCP‬اﺳﺖ زﻳﺮا ﭘﺮوﺗﮑﻞ ‪ UDP‬ﺑﻪ اﺗﺼﺎل ﻧﻴﺎز ﻧﺪارد ‪ .‬در‬
‫ﺑﺮﻧﺎﻣﻪ ‪ TCP‬ﺑﺎﻻ ﻳﮏ ﮐﻨﺘﺮل ‪ WinSock‬ﺑﺎﻳﺴﺘﻲ ﺣﺘﻤﺎً ‪ Listen‬ﻣﻲ ﮐﺮد و ﻳﮏ ﮐﻨﺘﺮل دﻳﮕﺮ ﻳﮏ اﺗﺼﺎل را ﺗﻮﺳﻂ ﻣﺘﺪ ‪Connect‬‬
‫اﻳﺠﺎد ﻧﻤﻮد ‪ .‬در ﻋﻮض ﭘﺮوﺗﮑﻞ ‪ UDP‬ﻧﻴﺎزي ﺑﻪ اﺗﺼﺎل ﻧﺪارد ‪ .‬ﺑﺮاي ارﺳﺎل دادﻩ ﺑﻴﻦ دو ﮐﻨﺘﺮل ‪ WinSock‬ﺳﻪ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺴﺘﻲ‬
‫اﻧﺠﺎم ﺷﻮد ‪:‬‬
‫‪ -‬ﭘﺎراﻣﺘﺮ ‪ RemoteHost‬ﺑﺮاﺑﺮ ﻧﺎم ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺎﺑﻞ اﺳﺖ ‪.‬‬
‫‪ -‬ﭘﺎراﻣﺘﺮ ‪ RemotePort‬ﺑﺮاﺑﺮ ﭘﺎراﻣﺘﺮ ‪ LocalPort‬ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺎﺑﻞ‬
‫‪ -‬اﺳﺘﻔﺎدﻩ از ﻣﺘﺪ ‪ Bind‬ﺑﺮاي ﻣﺸﺨﺺ ﮐﺮدن ‪LocalPort‬‬
‫ﭼﻮن هﺮ دو ﮐﺎﻣﭙﻴﻮﺗﺮ از ﻧﻈﺮ ارﺗﺒﺎط ﻣﺴﺎوي هﺴﺘﻨﺪ ‪ ،‬اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ هﺎ را ‪ Peer-to-Peer‬ﮔﻮﻳﻨﺪ ‪ .‬ﺑﺮاي ﻧﻤﻮﻧﻪ از ﮐﺪ زﻳﺮ ﺑﺮاي‬
‫ﺳﺎﺧﺖ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ‪ chat‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﮐﻨﻴﻢ ‪:‬‬
‫‪ -‬ﻳﮏ ﮐﻨﺘﺮل ‪ WinSock‬در ﻓﺮم ﻗﺮار دهﻴﺪ و ﻧﺎم ﺁﻧﺮا ‪ udppeerA‬ﺑﮕﺬارﻳﺪ ‪.‬‬
‫‪ -‬ﺧﺎﺻﻴﺖ ‪ Protocol‬ﺁﻧﺮا ‪ UDPProtocol‬ﻗﺮار دهﻴﺪ ‪.‬‬
‫‪ -‬دو ‪ textbox‬ﺑﺎ ﻧﺎﻣﻬﺎي ‪ txtsend‬و ‪ txtreceive‬و ﻧﻴﺰ ﻳﮏ دﮐﻤﻪ در ﻓﺮم ﻗﺮار دهﻴﺪ ‪.‬‬
‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي ﻣﺘﺪ ‪ Form_Load‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪udppeerA.RemoteHost=”nameofpeerB”x‬‬
‫‪udppeerA.RemotePort=1001‬‬
‫‪1002 udppeerA.Bind‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي ‪ event‬ﻣﺮﺑﻮط ﺑﻪ ﮐﻠﻴﮏ دﮐﻤﻪ ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪udppeerA.SendData txtsend.text‬‬

‫‪ -‬ﮐﺪ زﻳﺮ را ﺑﺮاي روﻳﺪاد ‪ DataArrival‬ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪Dim strData as String‬‬


‫‪strData udppeerA.GetData‬‬
‫‪txtreceive.Text=strData‬‬
‫ﺑﺮاي ﺳﺎﺧﺖ ‪ UDP peerB‬ﻣﺸﺎﺑﻪ ﻣﺮاﺣﻞ ﺑﺎﻻ ﻋﻤﻞ ﮐﻨﻴﺪ ﻓﻘﻂ ﺧﺎﺻﻴﺖ ‪ RemoteHost‬ﺁﻧﺮا ﻧﺎم ﮐﺎﻣﭙﻴﻮﺗﺮ ‪ PeerA‬و ﺧﺎﺻﻴﺖ‬
‫‪ RemotePort‬ﺁﻧﺮا ‪ 1002‬و ﺧﺎﺻﻴﺖ ‪ Bind‬ﺁﻧﺮا ‪ 1001‬ﻗﺮار دهﻴﺪ ‪.‬‬

‫ﮐﻨﺘﺮل‪ - WinSock‬ﻗﺴﻤﺖ دوم‬

‫ﺑﺮرﺳﯽ ﺧﻮاص ﮐﻨﺘﺮل ‪: WinSock‬‬


‫‪ : ByteReceived‬ﻣﻘﺪار دادﻩ درﻳﺎﻓﺖ ﺷﺪﻩ ) ﻣﻮﺟﻮد در ﺑﺎﻓﺮ ‪ ( receive‬را ﻧﺸﺎن ﻣﻲ دهﺪ ‪ .‬ﺗﻮﺳﻂ ﻣﺘﺪ ‪ GetData‬ﻣﻲ ﺗﻮان اﻳﻦ‬
‫دادﻩ را درﻳﺎﻓﺖ ﻧﻤﻮد ‪.‬‬
‫‪ : LocalHostName‬ﻧﺎم ﻣﺎﺷﻴﻦ ﻣﺤﻠﻲ را ﻧﺸﺎن ﻣﻲ دهﺪ ‪ .‬اﻳﻦ ﭘﺎراﻣﺘﺮ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ ‪.‬‬
‫‪ : LocalIP‬ﺁدرس ‪ IP‬ﻣﺎﺷﻴﻦ ﻣﺤﻠﻲ را ﺑﺼﻮرت ﻳﮏ ‪ string‬ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ‪ .‬اﻳﻦ ﭘﺎراﻣﺘﺮ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ ‪.‬‬
‫‪ : LocalPort‬ﺑﺮاي ﺧﻮاﻧﺪن و ﻳﺎ ﺗﻨﻈﻴﻢ ﺷﻤﺎرﻩ ﭘﻮرت ﻣﺤﻠﻲ ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫‪ : Protocol‬ﺑﺮاي ﺧﻮاﻧﺪن و ﻳﺎ ﺗﻨﻈﻴﻢ ﭘﺮوﺗﻮﮐﻞ ﻣﻮرد اﺳﺘﻔﺎدﻩ ﺗﻮﺳﻂ ﮐﻨﺘﺮل ‪ WinSock‬ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫‪ : RemoteHost‬ﺑﺮاي ﺧﻮاﻧﺪن و ﻳﺎ ﺗﻨﻈﻴﻢ ﻧﺎم ﻳﺎ ﺁدرس ‪ IP‬ﻣﺎﺷﻴﻦ راﻩ دور ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫‪ : RemoteHostIP‬ﺁدرس ‪ IP‬ﻣﺎﺷﻴﻦ راﻩ دور را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ‪:‬‬
‫‪ -١‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪ هﺎي ‪ Client‬ﺑﻌﺪ از زﻣﺎﻧﻴﮑﻪ ﻳﮏ اﺗﺼﺎل ﺗﻮﺳﻂ ﻣﺘﺪ ‪ Connect‬ﭘﺬﻳﺮﻓﺘﻪ ﺷﺪ ‪ ،‬اﻳﻦ ﺧﺎﺻﻴﺖ ﺣﺎوي ﺁدرس ‪IP‬‬
‫ﻣﺎﺷﻴﻦ راﻩ دور اﺳﺖ ‪.‬‬
‫‪ - ٢‬ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ‪ ، Server‬ﺑﻌﺪ از ﺁﻣﺪن ﻳﮏ ‪ Connection Request‬اﻳﻦ ﺧﺎﺻﻴﺖ ﺷﺎﻣﻞ ﺁدرس ‪ IP‬ﻣﺎﺷﻴﻦ راﻩ دور اﺳﺖ ‪.‬‬
‫‪ - ٣‬در زﻣﺎن اﺳﺘﻔﺎدﻩ از ﭘﺮوﺗﮑﻞ ‪ UDP‬ﺑﻌﺪ از اﻳﻨﮑﻪ روﻳﺪاد ‪ Arrival Data‬رخ داد اﻳﻦ ﺧﺎﺻﻴﺖ ﺣﺎوي ﺁدرس ‪ IP‬ﻣﺎﺷﻴﻨﻲ اﺳﺖ‬
‫ﮐﻪ دادﻩ را ﻓﺮﺳﺘﺎدﻩ ‪.‬‬
‫‪ : RemotePort‬ﺑﺮاي ﺧﻮاﻧﺪن و ﻳﺎ ﺗﻨﻈﻴﻢ ﺷﻤﺎرﻩ ﭘﻮرت ﻣﺎﺷﻴﻦ راﻩ دوري ﮐﻪ ﻣﻲ ﺧﻮاهﻴﺪ ﺑﻪ ﺁن ﻣﺘﺼﻞ ﺷﻮﻳﺪ ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫‪ : SocketHandle‬ﻣﻘﺪاري را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﮐﻪ ﻣﺮﺗﺒﻂ ﺑﺎ ﺳﻮﮐﺘﻲ اﺳﺖ ﮐﻪ ﮐﻨﺘﺮل ‪ WinSock‬را ﻣﺪﻳﺮﻳﺖ ﻣﻲ ﮐﻨﺪ و ﺑﺮاي ارﺗﺒﺎط‬
‫ﺑﺎ ﻻﻳﻪ ‪ WinSock‬ﺑﮑﺎر ﻣﻲ رود ‪ .‬اﻳﻦ ﭘﺎراﻣﺘﺮ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ اﺳﺖ و ﺗﻨﻬﺎ ﺑﺮاي ارﺳﺎل ﺑﻪ ‪ API‬هﺎي ‪ WinSock‬ﻃﺮاﺣﻲ ﺷﺪﻩ‬
‫اﺳﺖ ‪.‬‬
‫‪ : State‬وﺿﻌﻴﺖ ﮐﻨﺘﺮل ‪ WinSock‬را ﻧﺸﺎن ﻣﻲ دهﺪ ‪ .‬وﺿﻌﻴﺘﻬﺎي ﻣﻤﮑﻦ ﺑﺮاي ‪ State‬ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬
‫‪ : sckClosed - ١‬اﺗﺼﺎل ﺑﺴﺘﻪ اﺳﺖ ‪.‬‬
‫‪ : sckOpen - ٢‬اﺗﺼﺎل ﺑﺎز اﺳﺖ ‪.‬‬
‫‪ : sckListening - ٣‬ﺣﺎﻟﺖ ﮔﻮش دادن ﺑﻪ ﭘﻮرت‬
‫‪ : sckConnectionPending - 4‬ﻣﻌﻠﻖ ﺷﺪن اﺗﺼﺎل‬
‫‪ : sckResolvingHost - ۵‬ﺗﺼﻤﻴﻢ ﮔﻴﺮي در ﻣﻮرد ﻣﻴﺰﺑﺎن‬
‫‪ : sckHostResolved - ۶‬در ﻣﻮرد ﻣﻴﺰﺑﺎن ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﺷﺪ ‪.‬‬
‫‪ : sckConnecting - ٧‬ﺣﺎﻟﺖ ﺑﺮﻗﺮاري ارﺗﺒﺎط‬
‫‪ : sckConnected - ٨‬ارﺗﺒﺎط ﺑﺮﻗﺮار ﺷﺪ ‪.‬‬
‫‪ : sckClosing - ٩‬ﺣﺎﻟﺖ ﻗﻄﻊ اﺗﺼﺎل‬
‫‪ : sckError - ١٠‬ﺣﺎﻟﺖ ﺧﻄﺎ‬

‫ﺑﺮرﺳﯽ ﻣﺘﺪهﺎی ﮐﻨﺘﺮل ‪: WinSock‬‬


‫ﻣﺘﺪ ‪ : Accept‬ﺗﻨﻬﺎ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ هﺎي ‪ TCP Server‬ﺑﮑﺎر ﻣﻲ رود ‪ .‬اﻳﻦ ﻣﺘﺪ ﺑﺮاي ﭘﺬﻳﺮﻓﺘﻦ ﻳﮏ اﺗﺼﺎل در زﻣﺎن ﻣﺪﻳﺮﻳﺖ روﻳﺪاد‬
‫‪ ConnectionRequest‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ‪.‬‬
‫ﻣﺘﺪ ‪ : Bind‬اﻳﻦ ﭘﺎراﻣﺘﺮ ‪ LocalPort‬و ‪ LocalIP‬ﻳﮏ اﺗﺼﺎل را ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫ﻣﺘﺪ ‪ : Close‬ﺑﺮاي ﺑﺴﺘﻦ ﻳﮏ اﺗﺼﺎل ‪ TCP‬و ﻳﺎ ﺑﺴﺘﻦ ﻳﮏ ‪ listening socket‬ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫ﻣﺘﺪ ‪ : GetData‬ﺑﻠﻮک ﺟﺎري دادﻩ درﻳﺎﻓﺖ ﺷﺪﻩ را ﮔﺮﻓﺘﻪ و ﺁﻧﺮا در ﻣﺘﻐﻴﺮي از ﻧﻮع ‪ Variant‬ذﺧﻴﺮﻩ ﻣﻲ ﮐﻨﺪ ‪ .‬ﺷﮑﻞ ﮐﻠﻲ اﻳﻦ‬
‫ﻣﺘﺪ ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪WinSock.GetData data[,type][,maxlen]x‬‬
‫ﮐﻪ ‪ data‬دادﻩ درﻳﺎﻓﺘﻲ اﺳﺖ ‪ .‬اﮔﺮ دادﻩ ﮐﺎﻓﻲ ﻣﻮﺟﻮد ﻧﺒﺎﺷﺪ ‪ data‬ﺑﺮاﺑﺮ ‪ empty‬ﺧﻮاهﺪ ﺑﻮد ‪.‬‬
‫‪ type‬ﻧﻮع دادﻩ درﻳﺎﻓﺘﻲ اﺳﺖ ﮐﻪ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ زﻳﺮ ﺑﺎﺷﺪ ‪:‬‬
‫‪vbString - - vbInteger - vbLong - vbSingle - vbDouble - vbDate - vbBoolean - vbError - vbByte‬‬
‫‪vbArray+vbByte‬‬
‫‪ maxlen‬ﺣﺪاﮐﺜﺮ ﺳﺎﻳﺰ را در زﻣﺎن درﻳﺎﻓﺖ ﻳﮏ ‪ byte Array‬و ﻳﺎ ﻳﮏ ‪ string‬ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ ‪.‬‬
‫ﻣﺘﺪ ‪ Getdata‬در روﻳﺪاد ‪ Data Arrival‬اﺳﺘﻔﺎدﻩ ﻣﻲ ﺷﻮد ﮐﻪ اﻳﻦ روﻳﺪاد ﻳﮏ ﭘﺎراﻣﺘﺮ ﺑﺎ ﻧﺎم ‪ TotalBytes‬دارد ‪ .‬اﮔﺮ ‪ maxlen‬اي‬
‫ﮐﻪ ﺷﻤﺎ ﺗﻌﻴﻴﻦ ﮐﺮدﻩ اﻳﺪ ﮐﻤﺘﺮ از ‪ TotalBytes‬ﺑﺎﺷﺪ ﭘﻴﻐﺎم هﺸﺪار ﺷﻤﺎرﻩ ‪ ١٠٠۴٠‬درﻳﺎﻓﺖ ﻣﻲ ﮐﻨﻴﺪ ﺑﺪﻳﻦ ﻣﻌﻨﻲ ﮐﻪ ﺑﺎﻳﺘﻬﺎي‬
‫ﺑﺎﻗﻴﻤﺎﻧﺪﻩ ﮔﻢ ﺧﻮاهﻨﺪ ﺷﺪ ‪.‬‬
‫ﻣﺘﺪ ‪ : Listen‬ﻳﮏ ﺳﻮﮐﺖ ﻣﻲ ﺳﺎزد و ﺁﻧﺮا در ﺣﺎﻟﺖ ‪ Listen‬ﻗﺮار ﻣﻲ دهﺪ ‪ .‬اﻳﻦ ﻣﺘﺪ ﺗﻨﻬﺎ در اﺗﺼﺎﻻت ‪ TCP‬ﺑﮑﺎر ﻣﻴﺮود ‪.‬‬
‫ﻣﺘﺪ ‪ : PeekData‬ﻣﺸﺎﺑﻪ ‪ GetData‬اﺳﺖ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﮐﻪ دادﻩ را از ﺻﻒ ورودي ﺣﺬف ﻧﻤﻲ ﮐﻨﺪ ‪ .‬اﻳﻦ ﻣﺘﺪ ﺗﻨﻬﺎ ﺑﺮاي اﺗﺼﺎﻻت‬
‫‪ TCP‬ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫ﻣﺘﺪ ‪ : SendData‬ﺑﺮاي ارﺳﺎل دادﻩ ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ راﻩ دور ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫ﺑﺮرﺳﻲ ‪ event‬هﺎي ﮐﻨﺘﺮل ‪: WinSock‬‬
‫روﻳﺪاد ‪ : Close‬زﻣﺎﻧﻲ رخ ﻣﻲ دهﺪ ﮐﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ راﻩ دور اﺗﺼﺎل را ﺑﺒﻨﺪد ‪.‬‬
‫روﻳﺪاد ‪ : Connect‬ﺑﻌﺪ از اﻳﻨﮑﻪ ﻳﮏ اﺗﺼﺎل ﺑﻪ ‪ Server‬اﻳﺠﺎد ﺷﺪ روي ﻣﻲ دهﺪ ‪ .‬ﺷﮑﻞ ﮐﻠﻲ ﺁن ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪Boolean)x Private Sub WinSock_Connect(ErrorOccurred As‬‬

‫ﮐﻪ ﭘﺎراﻣﺘﺮ ‪ ErrorOccurred‬دو ﻣﻘﺪار دارد ‪ :‬اﮔﺮ ‪ True‬ﺑﺎﺷﺪ ﻳﻌﻨﻲ اﺗﺼﺎل ‪ Fail‬ﺷﺪﻩ اﺳﺖ و اﮔﺮ ‪ False‬ﺑﺎﺷﺪ ﻳﻌﻨﻲ اﺗﺼﺎل ﺑﺎ‬
‫ﻣﻮﻓﻘﻴﺖ اﻧﺠﺎم ﺷﺪﻩ اﺳﺖ ‪.‬‬
‫ﺑﺎ روﻳﺪاد ‪ Connect‬ﻣﻲ ﺗﻮاﻧﻴﺪ ‪ error‬هﺎﻳﻲ ﮐﻪ در زﻣﺎن ﻓﺮاﻳﻨﺪ ﺑﺎز ﮐﺮدن اﺗﺼﺎل ﺑﺮﮔﺮداﻧﺪﻩ ﺷﺪﻩ را ﭼﮏ ﮐﻨﻴﺪ ‪.‬‬
‫روﻳﺪاد ‪ : ConnectionRequest‬زﻣﺎﻧﻲ رخ ﻣﻲ دهﺪ ﮐﻪ ﻳﮏ ﮐﺎﻣﭙﻴﻮﺗﺮ راﻩ دور ﺗﻘﺎﺿﺎي ﻳﮏ اﺗﺼﺎل را ﺑﺪهﺪ ‪ .‬اﻳﻦ روﻳﺪاد ﻓﻘﻂ ﺑﺮاي‬
‫ﺑﺮﻧﺎﻣﻪ هﺎي ‪ TCP Server‬ﺑﮑﺎر ﻣﻲ رود ‪.‬‬
‫روﻳﺪاد ‪ : DataArrival‬زﻣﺎﻧﻲ رخ ﻣﻲ دهﺪ ﮐﻪ دادﻩ ﺟﺪﻳﺪي ﺑﻴﺎﻳﺪ ‪.‬‬
‫روﻳﺪاد ‪ : Error‬زﻣﺎﻧﻲ رخ ﻣﻲ دهﺪ ﮐﻪ ﻳﮏ ﺧﻄﺎ در ﻓﺮاﻳﻨﺪ ارﺗﺒﺎط رخ دهﺪ ) ﻣﺜﻼً ‪ Failed to Connect‬و ﻳﺎ ‪. ( Failed to Send‬‬
‫ﺷﮑﻞ ﮐﻠﻲ ﺁن ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪as String,scode as Long,source as String,helpfile as Private WinSock_Error(number as Integer,description‬‬


‫‪Long,canceldisplay as Boolean)x String,helpcontext as‬‬

‫‪ number‬ﺷﻤﺎرﻩ ﮐﺪ ﺧﻄﺎ اﺳﺖ ‪.‬‬


‫‪ description‬ﺗﻮﺿﻴﺤﻲ در ﻣﻮرد ﺧﻄﺎ اﺳﺖ ‪.‬‬
‫‪ source‬ﺗﻮﺻﻴﻒ ﻣﻨﺒﻊ ﺧﻄﺎ‬
‫‪ : canceldisplay‬ﻣﺸﺨﺺ ﻣﻲ ﮐﻨﺪ ﺁﻳﺎ ﭘﻴﻐﺎم ﺧﻄﺎي ﭘﻴﺶ ﻓﺮض ﻧﺸﺎن دادﻩ ﺷﻮد ﻳﺎ ﻧﻪ‬
‫روﻳﺪاد ‪ : SendComplete‬زﻣﺎﻧﻲ رخ ﻣﻲ دهﺪ ﮐﻪ ﻳﮏ ﻋﻤﻞ ‪ Send‬ﺗﮑﻤﻴﻞ ﺷﺪﻩ ﺑﺎﺷﺪ ‪.‬‬
‫روﻳﺪاد ‪ : SendProgress‬زﻣﺎﻧﻲ رخ ﻣﻲ دهﺪ ﮐﻪ ﮐﻨﺘﺮل ﺷﺮوع ﺑﻪ ارﺳﺎل دادﻩ ﻧﻤﺎﻳﺪ ‪ .‬ﺷﮑﻞ ﮐﻠﻲ ﺁن ﺑﺼﻮرت زﻳﺮ اﺳﺖ ‪:‬‬

‫‪bytesRemaining As Long)x ,WinSock_SendProgress (bytesSent As Long‬‬

‫ﮐﻪ ‪ bytesSent‬ﺗﻌﺪاد ﺑﺎﻳﺘﻬﺎي ارﺳﺎل ﺷﺪﻩ و ‪ bytesRemaining‬ﺗﻌﺪاد ﺑﺎﻳﺘﻬﺎي ﺑﺎﻗﻴﻤﺎﻧﺪﻩ اﺳﺖ ‪.‬‬
‫‪ TAPI‬در وﻳﮋوال ﺑﻴﺴﻴﮏ ‪ -‬ﻣﻘﺪﻣﻪ‬

‫‪ TAPI‬ﭼﻴﺴﺖ ؟‬

‫‪ TAPI‬ﻳﺎ ‪ Telephony API‬ﻳﮏ ﮐﺘﺎﺑﺨﺎﻧﻪ اﺳﺘﺎﻧﺪارد ﺑﺮای ﮐﺎر ﺑﺎ ﻣﻮدم و ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ هﺎی ﺗﻠﻔﻨﯽ ﻣﯽ ﺑﺎﺷﺪ ‪ .‬ﺑﺮای ﻧﻤﻮﻧﻪ ﻣﯽ‬
‫ﺗﻮان از ﺑﺮﻧﺎﻣﻪ هﺎی ‪ ) Phone Dialer‬ﺷﻤﺎرﻩ ﮔﻴﺮ ﺗﻠﻔﻦ ( ‪ ،‬ﺑﺮﻧﺎﻣﻪ ﺷﺒﮑﻪ ﺳﺎزی ﺗﻠﻔﻨﯽ ) ‪ ، ( Dialup Networking‬ﺑﺮﻧﺎﻣﻪ‬
‫ﺗﺸﺨﻴﺺ ﭘﺎﻟﺲ ﻣﻮدم ﺑﺮای ﺿﺒﻂ اﻃﻼﻋﺎت وارد ﺷﺪﻩ از ﻃﺮف ﮐﺎرﺑﺮان و ﮐﺎرﺑﺮدهﺎی دﻳﮕﺮ در اﻳﻦ زﻣﻴﻨﻪ ﻧﺎم ﺑﺮد ‪ .‬اﻳﻦ ﮐﺘﺎﺑﺨﺎﻧﻪ ﺑﻪ‬
‫ﺷﻤﺎ ﮐﻤﮏ ﮐﻤﮏ ﻣﯽ ﮐﻨﺪ ﺗﺎ ﺑﺪون درﮔﻴﺮ ﺷﺪن ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﯽ ﺳﺨﺖ اﻓﺰار ﻣﻮدم و دراﻳﻮر ﺁن ﺑﻄﻮر ﻣﺴﺘﻘﻴﻢ ﺑﺘﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ‬
‫هﺎی ﮐﺎرﺑﺮدﯾﻲ در اﻳﻦ زﻣﻴﻨﻪ ﺑﻨﻮﻳﺴﻴﺪ ‪.‬‬

‫‪ TAPI‬در وﻳﮋوال ﺑﻴﺴﻴﮏ ‪ -‬ﺑﺨﺶ اول‬

‫ﻣﺮوری ﺑﺮ ‪: Microsoft Telephony‬‬

‫‪ Telephony‬اﻣﮑﺎن ﻣﺠﺘﻤﻊ ﺳﺎزی ﮐﺎﻣﭙﻴﻮﺗﺮهﺎ ﺑﺎ دﺳﺘﮕﺎهﻬﺎی ارﺗﺒﺎﻃﯽ و ﺷﺒﮑﻪ هﺎ را ﻓﺮاهﻢ ﻧﻤﻮدﻩ اﺳﺖ ‪ .‬ﻣﻌﻤﻮﻻً دﺳﺘﮕﺎﻩ‬
‫ارﺗﺒﺎﻃﯽ ﻳﮏ ﻣﻮدم و ﺧﻂ ارﺗﺒﺎﻃﯽ ﻧﻴﺰ ﺷﺒﮑﻪ ‪ ) PSTN‬ﺷﺒﮑﻪ ﻋﻤﻮﻣﯽ ﺗﻠﻔﻦ ﺳﻮﺋﻴﭽﻴﻨﮓ ( ﻣﯽ ﺑﺎﺷﺪ ‪ .‬ﺑﺮﺧﯽ از ﮐﺎرﺑﺮدهﺎی‬
‫‪ Telephony‬ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬

‫ﮐﻨﻔﺮاﻧﺴﻬﺎی ﻣﺎﻟﺘﯽ ﻣﺪﻳﺎ ﺑﺼﻮرت ‪Multicast‬‬ ‫‪-‬‬ ‫‪١‬‬


‫‪VoIP‬‬ ‫‪-‬‬ ‫‪٢‬‬
‫ﻣﺮﮐﺰ ﭘﺎﺳﺦ ﮔﻮﻳﻲ اﺗﻮﻣﺎﺗﻴﮏ‬ ‫‪-‬‬ ‫‪٣‬‬
‫ﺗﻤﺎس ﺗﻠﻔﻨﯽ از ﻃﺮﻳﻖ ﮐﺎﻣﭙﻴﻮﺗﺮ روی ﺷﺒﮑﻪ ‪PSTN‬‬ ‫‪-‬‬ ‫‪۴‬‬

‫دﻳﺎﮔﺮام زﻳﺮ ﻣﻌﻤﺎری ‪ Microsoft Telephony‬را ﻧﺸﺎن ﻣﯽ دهﺪ ‪:‬‬


‫ﺑﺮﻧﺎﻣﻪ هﺎی ‪: TAPI‬‬

‫ﺑﺮای ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ هﺎی ﮐﺎرﺑﺮدی ﺑﺎ اﺳﺘﻔﺎدﻩ از ‪ TAPI‬ﺑﺎﻳﺴﺘﯽ اﺑﺘﺪا در ﻣﻮرد ﺳﻄﺢ ﺳﺮوﻳﺴﯽ ﮐﻪ ﻣﯽ ﺧﻮاهﻴﻢ اراﺋﻪ دهﻴﻢ‬
‫ﺗﺼﻤﻴﻢ ﮔﻴﺮی ﮐﻨﻴﻢ ‪ .‬ﺑﺮای ﻣﺜﺎل ﺑﺮای ﻧﻮﺷﺘﻦ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎرﻩ ﮔﻴﺮ ﺗﻠﻔﻦ ﻧﻴﺎز ﺑﻪ اﺳﺘﻔﺎدﻩ ﮐﺎﻣﻞ از ‪ TAPI‬ﻧﻴﺴﺖ و ﻣﯽ ﺗﻮان‬
‫از ﻗﺎﺑﻠﻴﺘﻬﺎی ﺧﻮد وﻳﻨﺪوز در اﻳﻦ زﻣﻴﻨﻪ اﺳﺘﻔﺎدﻩ ﮐﺮد ) ‪ . ( Assisted Telephony‬در ﺑﺨﺸﻬﺎی ﺑﻌﺪی در ﻣﻮرد ﺳﻄﻮح ﻣﺨﺘﻠﻒ‬
‫ﺳﺮوﻳﺲ در ‪ TAPI‬ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاهﻢ ﮐﺮد ‪.‬‬
‫دوﻣﻴﻦ ﻣﻄﻠﺒﯽ ﮐﻪ ﺑﺎﻳﺪ ﻣﻮرد ﺗﻮﺟﻪ ﻗﺮار داد اﻳﻨﺴﺖ ﮐﻪ ﻣﯽ ﺧﻮاهﻴﻢ از ‪ TAPI 2.x‬اﺳﺘﻔﺎدﻩ ﮐﻨﻴﻢ ﻳﺎ از ‪ . TAPI 3.x‬ﺗﻔﺎوت اﻳﻨﺪو‬
‫ﺁﻧﺴﺖ ﮐﻪ ‪ TAPI‬ورژن ‪ ٢‬ﻳﮏ ‪ API‬ﺑﺮﻣﺒﻨﺎی ‪ C‬اﺳﺖ در ﺣﺎﻟﻴﮑﻪ ورژن ‪ ٣‬ﺁن ﺑﺮ ﻣﺒﻨﺎی ﺗﮑﻨﻮﻟﻮژی ‪ COM‬ﻣﯽ ﺑﺎﺷﺪ ‪ .‬در ﺑﺨﺸﻬﺎی‬
‫ﺑﻌﺪی ﻣﻄﺎﻟﺐ ﺑﻴﺸﺘﺮی در ﻣﻮرد ﺗﻔﺎوﺗﻬﺎی اﻳﻦ دو ﻧﺴﺨﻪ ﺑﻴﺎن ﺧﻮاهﻢ ﮐﺮد ‪.‬‬
‫ﺑﺨﺸﻬﺎی اﺻﻠﯽ ﻳﮏ ﺑﺮﻧﺎﻣﻪ ﮐﺎﻣﻞ ‪ TAPI‬ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬

‫‪ : TAPI Initialization - ١‬ﺷﺎﻣﻞ ‪ load‬ﮐﺮدن ‪ ، TAPI dll‬اﺗﺼﺎل ﺑﻪ ‪ ، Server TAPI‬ﻣﺬاﮐﺮﻩ در ﻣﻮرد ورژن ‪ TAPI‬و ﺑﺮﭘﺎﺳﺎزی‬
‫ﺳﻴﺴﺘﻢ اﻃﻼع رﺳﺎﻧﯽ ‪ event‬ﻣﯽ ﺑﺎﺷﺪ ‪.‬‬

‫‪ : Session Control - ٢‬ﻣﻘﺪاردهﯽ اوﻟﻴﻪ ‪ ،‬درﻳﺎﻓﺖ و ﮐﻨﺘﺮل ﺗﻤﺎﺳﻬﺎ‬

‫‪ : Device Control - ٣‬درﻳﺎﻓﺖ و ﺗﻨﻈﻴﻢ اﻃﻼﻋﺎت دﺳﺘﮕﺎﻩ‬

‫‪ : Media Control - ۴‬ﺗﺸﺨﻴﺺ و ﻳﺎ ﺗﻮﻟﻴﺪ ﺗﻮﻧﻬﺎ و ارﻗﺎم ‪ ،‬ﮐﻨﺘﺮل ‪stream‬‬


‫‪ : TAPI Shutdown - ۵‬ﺁزاد ﺳﺎزی ﻣﻨﺎﺑﻊ‬

‫دﻳﺎﮔﺮام زﻳﺮ اﻳﻦ ﻣﺮاﺣﻞ را ﺑﻬﺘﺮ ﻧﺸﺎن ﻣﯽ دهﺪ ‪:‬‬

‫در ﺑﺨﺸﻬﺎی ﺑﻌﺪی در ﻣﻮرد هﺮ ﻳﮏ از اﻳﻦ ﻣﺮاﺣﻞ ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاهﻢ ﮐﺮد ‪.‬‬
‫‪ TAPI‬در وﻳﮋوال ﺑﻴﺴﻴﮏ ‪ -‬ﺑﺨﺶ دوم‬

‫ﻣﻘﺪاردهﯽ اوﻟﻴﻪ ‪: TAPI‬‬

‫ﻋﻤﻠﮑﺮد درﺳﺖ اﺟﺰای ‪ TAPI‬ﻧﻴﺎز ﺑﻪ ﺑﺮﭘﺎﺳﺎزی ﻣﺤﻴﻂ ارﺗﺒﺎﻃﯽ روی ﮐﺎﻣﭙﻴﻮﺗﺮ ﻣﻮرد ﻧﻈﺮ دارد ‪ .‬ﻣﺮاﺣﻞ اﻳﻦ اﻣﺮ ﻋﺒﺎرﺗﻨﺪ از ‪:‬‬

‫‪ - ١‬ﻧﺼﺐ ‪ : TAPI‬زﻣﺎﻧﻴﮑﻪ ﺳﺨﺖ اﻓﺰار و ﻳﺎ ﻧﺮم اﻓﺰار ﺑﺮای اوﻟﻴﻦ ﺑﺎر ﺑﻪ ﮐﺎﻣﭙﻴﻮﺗﺮ اﺿﺎﻓﻪ ﻣﯽ ﺷﻮد اﻧﺠﺎم ﻣﯽ ﮔﻴﺮد ‪ .‬ﺟﺰﺋﻴﺎت ﮐﺎر‬
‫ﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ و ﻧﺮم اﻓﺰار ﺑﺴﺘﮕﯽ دارد ‪.‬‬

‫‪ - ٢‬ﻣﻘﺪاردهﯽ اﺑﺘﺪاﺋﯽ ‪ :‬ﺳﺎﺧﺖ اﺷﻴﺎ و ﻣﺴﻴﺮهﺎی ارﺗﺒﺎﻃﯽ‬

‫‪ - ٣‬ﻣﺬاﮐﺮﻩ در ﻣﻮرد ورژن ‪ : TAPI‬ﺑﺮای اﻃﻤﻴﻨﺎن از اﻳﻨﮑﻪ اﺟﺰای ‪ TAPI‬ﻗﺎدر ﺑﻪ ﺗﺒﺎدل دادﻩ هﺎ ﺑﺎﺷﻨﺪ ‪.‬‬

‫‪ - ۴‬اﺳﺘﺨﺮاج اﻃﻼﻋﺎت ﻣﻨﺎﺑﻊ ‪ :‬ﺑﺪﺳﺖ ﺁوردن اﻃﻼﻋﺎﺗﯽ در ﻣﻮرد دﺳﺘﮕﺎهﯽ ﮐﻪ ﻣﯽ ﺗﻮان از ﺁن در ﺑﺮﻧﺎﻣﻪ ‪ TAPI‬ﻣﻮرد ﻧﻈﺮﻣﺎن‬
‫اﺳﺘﻔﺎدﻩ ﻧﻤﻮد ‪.‬‬

‫‪ : Event notification - ۵‬ﺑﺮﭘﺎﺳﺎزی ﺳﻴﺴﺘﻢ اﻃﻼع رﺳﺎﻧﯽ ‪event‬‬

‫‪ TAPI‬در وﻳﮋوال ﺑﻴﺴﻴﮏ ‪ -‬ﺑﺨﺶ ﺳﻮم‬

‫ﻣﻘﺪاردهﯽ اوﻟﻴﻪ ‪ TAPI‬در وﻳﮋوال ﺑﻴﺴﻴﮏ ‪:‬‬

‫از ﻣﻨﻮی ‪ Project‬ﮔﺰﻳﻨﻪ ‪ References‬را اﻧﺘﺨﺎب ﮐﺮدﻩ و از ﻟﻴﺴﺖ ﻣﺮﺑﻮﻃﻪ ﻣﻮرد ‪ Microsoft TAPI 3.0 Type Library‬را اﻧﺘﺨﺎب‬
‫ﮐﻨﻴﺪ ‪.‬‬
‫ﺣﺎل وارد ﺑﺨﺶ ﮐﺪ ﻧﻮﻳﺴﯽ ﻓﺮﻣﺘﺎن ﺷﻮﻳﺪ و ﻣﺘﻐﻴﺮ ‪ objTAPI‬را ﺑﺼﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﮐﻨﻴﺪ ‪:‬‬

‫‪Dim objTapi As TAPI‬‬

‫ﺳﭙﺲ در ﺑﺨﺶ ﻣﺮﺑﻮط ﺑﻪ ‪ Load Form‬ﺷﯽ ‪ objTAPI‬را ﺑﺼﻮرت زﻳﺮ اﻳﺠﺎد ﻣﯽ ﮐﻨﻴﻢ ‪:‬‬

‫‪Set objTapi = New TAPI‬‬

‫هﻤﺎﻧﻄﻮر ﮐﻪ در ﺑﺨﺸﻬﺎی ﻗﺒﻠﯽ ﮔﻔﺘﻪ ﺷﺪ ‪ ،‬ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﯽ هﺮ ﺗﺎﺑﻊ ‪ TAPI‬اﺑﺘﺪا ﺑﺎﻳﺴﺘﯽ ﺁﻧﺮا ﻣﻘﺪاردهﯽ اوﻟﻴﻪ ﮐﻨﻴﻢ ‪ .‬ﺑﺮای‬
‫ﻣﻘﺪاردهﯽ اوﻟﻴﻪ ﮐﺮدن ﺷﯽ ‪ TAPI‬ﻋﺒﺎرت زﻳﺮ را ﺑﻨﻮﻳﺴﻴﺪ ‪:‬‬

‫‪Call objTapi.Initialize‬‬
‫ ﺑﺨﺶ ﭼﻬﺎرم‬- ‫ در وﻳﮋوال ﺑﻴﺴﻴﮏ‬TAPI

: ‫اﻧﺘﺨﺎب ﻳﮏ ﺁدرس‬
‫ در وﻳﮋوال ﺑﻴﺴﻴﮏ ﻣﻨﺎﺑﻊ ﺗﻠﻔﻨﯽ در دﺳﺘﺮس را ﺑﺮای ﻳﮏ‬TAPI ‫ﮐﺪ زﻳﺮ ﻧﺸﺎن ﻣﯽ دهﺪ ﮐﻪ ﭼﮕﻮﻧﻪ ﻣﯽ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎدﻩ از ﺷﯽ‬
. ‫ ﺑﺮرﺳﯽ ﮐﺮد‬، ‫ﺁدرس ﮐﻪ ﺑﺘﻮاﻧﺪ ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﻣﺸﺨﺺ از ﻧﻴﺎزهﺎ را ﻣﺪﻳﺮﻳﺖ ﮐﻨﺪ‬
‫ اﻧﺠﺎم‬، ‫ را ﮐﻪ در ﺑﺨﺶ ﻗﺒﻞ ررﺳﯽ ﺷﺪ‬TAPI ‫ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﻗﺒﻞ از اﻧﺠﺎم اﻳﻦ ﮐﺎر ﺑﺎﻳﺴﺘﯽ ﻋﻤﻞ ﻣﻘﺪاردهﯽ اوﻟﻴﻪ‬
. ‫دهﻴﺪ‬

‫ اﻧﺠﺎم ﻧﮕﺮﻓﺘﻪ اﺳﺖ و ﺑﺮای اﺳﺘﻔﺎدﻩ از ﮐﺪ زﻳﺮ در ﺑﺮﻧﺎﻣﻪ هﺎی واﻗﻌﯽ ﺑﺎﻳﺴﺘﯽ ﺑﺨﺶ‬error checking ‫ در ﮐﺪ زﻳﺮ ﻋﻤﻞ‬: ‫ﻧﮑﺘﻪ‬
. ‫ﺑﺮرﺳﯽ ﺧﻄﺎ را ﺑﻪ ﺁن اﺿﺎﻓﻪ ﮐﻨﻴﺪ‬
: ‫ ﺗﻌﺮﻳﻒ ﻳﮏ ﺷﯽ ﺁدرس و ﻳﮏ ﺷﯽ ﻣﺠﻤﻮﻋﻪ ﺁدرس‬- ١

Dim gobjAddress As ITAddress


As ITCollection Dim objCollAddresses

: objTapi ‫ ﺑﻌﻨﻮان ﻳﮏ ﻣﺠﻤﻮﻋﻪ ﺁدرس از ﺷﯽ‬objCollAddress ‫ ﺗﻨﻈﻴﻢ ﺷﯽ‬- ٢

Set objCollAddresses = objTapi.Addresses

: ‫ ﭘﻴﺪا ﮐﺮدن ﺁدرﺳﯽ ﮐﻪ ﺑﺘﻮاﻧﺪ از واﺳﻂ ﻣﻮرد ﻧﻈﺮ ﻣﺎ ﭘﺸﺘﻴﺒﺎﻧﯽ ﮐﻨﺪ‬- ٣

bFound = False
objCollAddresses.Count For indexAddr = 1 To
objCollAddresses.Item(indexAddr)x = Set objCrtAddress
Set objMediaSupport = objCrtAddress
objAddressCapabilities = objCrtAddress Set

nSelectedType ) x )If objMediaSupport.QueryMediaType


bFound = True
End If

Nothing = Set objAddressCapabilities


Set objMediaSupport = Nothing
Nothing = Set objCrtAddress

If bFound = True Then Exit For


Next indexAddr

: ‫ ﻳﮏ ﺁدرس ﻗﺎﺑﻞ اﺳﺘﻔﺎدﻩ ﺧﻮاهﺪ ﺑﻮد‬gobjAddress ‫در ﺻﻮرﺗﻴﮑﻪ ﺁدرس ﻣﻮرد ﻧﻈﺮ ﭘﻴﺪا ﺷﻮد ﺑﺮﻧﺎﻣﻪ از ﺣﻠﻘﻪ ﺧﺎرج ﺷﺪﻩ و‬

objcollAddresses.Item(indexAddr)x = Set gobjAddress


‫ ﺑﺨﺶ ﭘﻨﺠﻢ‬- ‫ در وﻳﮋوال ﺑﻴﺴﻴﮏ‬TAPI

: TAPI ‫ در‬Event Handling ‫اﻧﺠﺎم‬

‫ و رﺟﻴﺴﺘﺮ ﮐﺮدن‬event ‫ ﺗﻨﻈﻴﻢ ﻓﻴﻠﺘﺮ‬، event ‫ رﺟﻴﺴﺘﺮ ﮐﺮدن واﺳﻂ‬، TAPI ‫ ﺳﺎدﻩ ﺑﺮای‬event handler ‫ﮐﺪ زﻳﺮ ﺷﺎﻣﻞ ﻳﮏ‬
‫ هﺎ را‬event ‫ ﮐﻪ‬TAPI ‫ هﺪف اﺻﻠﯽ از اﻳﻦ ﮐﺪ اﻳﻨﺴﺖ ﮐﻪ ﻣﻄﻤﺌﻦ ﺷﻮﻳﻢ ﺑﺨﺸﯽ از‬. ‫ﺗﻤﺎم ﻓﺮاﺧﻮاﻧﻴﻬﺎی دادن اﺧﻄﺎر اﺳﺖ‬
. ‫درﻳﺎﻓﺖ ﻣﯽ ﮐﻨﺪ ﭘﺮدازﺷﯽ را ﻗﺒﻞ از اﻧﺘﻘﺎل ﺑﻪ ﺑﺨﺸﻬﺎی دﻳﮕﺮ اﻧﺠﺎم دهﺪ‬

: ‫ﺗﻌﺎرﻳﻔﻬﺎ‬

TAPI Dim WithEvents gobjTapiWithEvents As


Attribute gobjTapiWithEvents.VB_VarHelpID = -1
glRegistrationToken As Long Dim

Const TAPI3_CALL_EVENTS =TE_CALLMEDIA Or


TE_CALLNOTIFICATION Or TE_CALLSTATE

: ‫ را ﺑﭙﺬﻳﺮد‬TAPI ‫ هﺎی ﺗﻌﺮﻳﻒ ﺷﺪﻩ ﺑﺮای‬event ‫ ﺑﺼﻮرﺗﻴﮑﻪ ﺗﻤﺎم‬eventfilter ‫ﺗﻨﻈﻴﻢ‬

TAPI3_CALL_EVENTS = objTapi.EventFilter

: ‫ هﺎ‬event ‫رﺟﻴﺴﺘﺮ ﮐﺮدن‬

Set gobjTapiWithEvents = objTapi


Boolean, fMonitor As Boolean Dim fOwner As
Long Dim lMediaTypes As Long, lCallbackInstance As

fOwner = True
fOwner = True
fMonitor = False
TAPIMEDIATYPE_AUDIO = lMediaTypes
lCallbackInstance = 1

,gobjTapi.RegisterCallNotifications(gobjAddress,fMonitor = glRegistrationToken
fOwner,lMediaTypes,lCallbackInstance)x
‫ ﺑﺨﺶ ﺷﺸﻢ‬- ‫ در وﻳﮋوال ﺑﻴﺴﻴﮏ‬TAPI

: ‫اﻧﺘﺨﺎب ﻳﮏ ﺗﺮﻣﻴﻨﺎل‬

‫ و ﻋﻤﻞ اﻧﺘﺨﺎب ﺁدرس را اﻧﺠﺎم‬TAPI Initialization ‫ ﻗﺒﻞ از اﻳﻨﮑﻪ ﻳﮏ ﺗﺮﻣﻴﻨﺎل را ﺑﺮای ﺑﺮﻗﺮاری ارﺗﺒﺎط اﻧﺘﺨﺎب ﮐﻨﻴﺪ ﺑﺎﻳﺴﺘﯽ‬+
. ‫دادﻩ ﺑﺎﺷﻴﺪ‬

: ‫ ) واﺳﻂ ﮐﻨﺘﺮل ﺗﻤﺎس ( ﺗﻌﺮﻳﻒ ﻣﯽ ﮐﻨﻴﻢ‬ITBasicCallControl ‫اﺑﺘﺪا ﻳﮏ ﻣﺘﻐﻴﺮ از ﻧﻮع‬

Dim objCallControl As ITBasicCallControl


objCallControl = gobjReceivedCallInfo Set

: ‫ ) ﮐﻮﺋﺮی از ﺷﯽ ﺁدرس ( ﺗﻌﺮﻳﻒ ﻣﯽ ﮐﻨﻴﻢ‬ITTerminalSupport ‫ﺳﭙﺲ ﻳﮏ ﻣﺘﻐﻴﺮ از ﻧﻮع‬

Dim objTerminalSupport As ITTerminalSupport


objTerminalSupport = gobjAddress Set

: ‫ ﻳﮏ ﺗﺮﻣﻴﻨﺎل را ﺑﺮای ﺁن اﺳﺘﺨﺮاج ﻣﯽ ﮐﻨﻴﻢ‬objTerminalSupport ‫ﺳﭙﺲ ﻣﺘﻐﻴﺮ ﺗﺮﻣﻴﻨﺎل را ﺗﻌﺮﻳﻒ ﮐﺮدﻩ و ﺗﻮﺳﻂ ﺷﯽ‬

Dim objTerminal As ITTerminal


objTerminalSupport.GetDefaultStaticTerminal(lMediaType, dir)x = Set objTerminal

: ‫ ﻧﻴﺴﺖ ﺑﻨﺎﺑﺮاﻳﻦ ﺁﻧﺮا ﺁزاد ﻣﯽ ﮐﻨﻴﻢ‬objTerminalSupport ‫در اﻳﻨﺠﺎ دﻳﮕﺮ ﻧﻴﺎزی ﺑﻪ ﺷﯽ‬

Set objTerminalSupport = Nothing

: ‫ ﺑﺮای ﮐﻨﺘﺮل ﺗﺮﻣﻴﻨﺎل اﺳﺖ‬objStreamControl ‫ﺳﭙﺲ ﻧﻴﺎز ﺑﻪ ﺗﻌﺮﻳﻒ ﺷﯽ‬

Dim objStreamControl As ITStreamControl


objStreamControl = objCallControl Set

for ‫ اﻣﮑﺎن اﻳﺠﺎد ﺗﺮﻣﻴﻨﺎل در ﻳﮏ ﺣﻠﻘﻪ‬ITCollection ‫ ﺑﻪ ازای اﺳﺘﺮﻳﻢ هﺎی ﻣﻮﺟﻮد در‬، ‫در ﺻﻮرﺗﻴﮑﻪ اﻳﻦ ﺷﯽ اﻳﺠﺎد ﺷﻮد‬
: ‫ﺑﺮرﺳﯽ ﻣﯽ ﺷﻮد و ﺗﺮﻣﻴﻨﺎل ﻣﻨﺎﺳﺐ اﻧﺘﺨﺎب ﻣﯽ ﮔﺮدد‬

If Not (objStreamControl Is Nothing) Then


objITCollStreams As ITCollection Dim

objStreamControl.Streams = Set objITCollStreams


ITStream Dim nIndex As Long, objCrtStream As

For nIndex = 1 To objITCollStreams.Count


objITCollStreams.Item(nIndex)x = Set objCrtStream
Then If objCrtStream.MediaType = lMediaType
If objCrtStream.Direction = dir Then
objCrtStream.SelectTerminal(objTerminal)x Call
End If
End If
objCrtStream = Nothing Set
Next nIndex

Nothing = Set objITCollStreams


Set objStreamControl = Nothing
End If

: ( Make a Call ) ‫اﻳﺠﺎد ﻳﮏ ﺗﻤﺎس‬


. ‫ و ﻋﻤﻞ اﻧﺘﺨﺎب ﺁدرس اﻧﺠﺎم ﺷﺪﻩ ﺑﺎﺷﺪ‬TAPI Initialization ‫ ﻗﺒﻞ از اﻳﻦ ﺑﺨﺶ ﺑﺎﻳﺴﺘﯽ ﻣﺮاﺣﻞ‬+
‫ اﻧﺘﺨﺎب و‬، ‫ ﺑﺮرﺳﯽ و ﻣﺸﺨﺺ ﮐﺮدن اﺳﺘﺮﻳﻤﯽ ﮐﻪ ﺑﺎ اﻳﻦ ﺗﻤﺎس در ارﺗﺒﺎط اﺳﺖ‬، ‫اﻳﻦ ﺑﺨﺶ ﺑﺮای اﻳﺠﺎد ﻳﮏ ﺷﯽ ﺗﻤﺎس‬
. ‫اﻳﺠﺎد ﺗﺮﻣﻴﻨﺎﻟﻬﺎی ﻣﻨﺎﺳﺐ و ﮐﺎﻣﻞ ﮐﺮدن ارﺗﺒﺎط اﺳﺘﻔﺎدﻩ ﻣﯽ ﺷﻮد‬
. ‫ و ﻋﻤﻞ اﻧﺘﺨﺎب ﺁدرس و اﻧﺘﺨﺎب ﺗﺮﻣﻴﻨﺎل اﻧﺠﺎم ﺷﺪﻩ ﺑﺎﺷﺪ‬TAPI Initialization ‫ﻗﺒﻞ‬
: ‫ ﻳﮏ ﺷﯽ ﺗﻤﺎس ﺳﺎﺧﺘﻪ ﻣﯽ ﺷﻮد‬CreateCall ‫در اﺑﺘﺪا ﺑﺎ اﺳﺘﻔﺎدﻩ از ﻣﺘﺪ‬

nSelectedType,lMediaTypes)x ,gobjOrigAddress.CreateCall(strDestAddress = Set gobjCall

: ‫ﺳﭙﺲ در اﻳﻨﺠﺎ ﺑﺎﻳﺴﺘﯽ ﮐﺪی ﮐﻪ در ﺑﺨﺶ اول اﻳﻦ درس ﺑﺮای اﻧﺘﺨﺎب ﺗﺮﻣﻴﻨﺎل ﻧﻮﺷﺘﻪ ﺷﺪ ﺁوردﻩ ﺷﻮد‬

{
Select Terminal Code
}

: ‫ اﺟﺮا ﺷﻮد‬Connect ‫ﺳﭙﺲ ﺑﺎﻳﺴﺘﯽ دﺳﺘﻮر‬

gobjCall.Connect (False)x

. ‫ ﺑﺪﻳﻦ ﻣﻌﻨﺎﺳﺖ ﮐﻪ ارﺗﺒﺎط ﺑﺼﻮرت ﺁﺳﻨﮑﺮون ﺑﺮﻗﺮار ﻣﯽ ﺷﻮد‬False


‫ ﺑﺨﺶ ﭘﺎﻳﺎﻧﯽ‬- ‫ در وﻳﮋوال ﺑﻴﺴﻴﮏ‬TAPI

: ‫درﻳﺎﻓﺖ ﻳﮏ ﺗﻤﺎس‬

‫ ﺑﺎﻳﺴﺘﯽ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ‬. ‫ﮐﺪ زﻳﺮ ﺑﺮای ﻳﺎﻓﺘﻦ و ﻳﺎ اﻳﺠﺎد ﻳﮏ ﺗﺮﻣﻴﻨﺎل ﻣﻨﺎﺳﺐ ﺑﺮای درﻳﺎﻓﺖ ﻳﮏ ﺗﻤﺎس ﺑﮑﺎر ﻣﯽ رود‬
. ‫ هﺎ را اﻧﺠﺎم دهﻴﺪ‬event ‫ اﻧﺘﺨﺎب ﻳﮏ ﺁدرس و رﺟﻴﺴﺮ ﮐﺮدن‬، ‫ﻗﺒﻞ از اﺟﺮای ﮐﺪ زﻳﺮ ﺑﺎﻳﺴﺘﯽ ﻣﺮاﺣﻞ ﻣﻘﺪاردهﯽ اوﻟﻴﻪ‬
‫ ﻳﮏ‬pEvent ‫ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ در ﮐﺪ زﻳﺮ ﻣﺘﻐﻴﺮ‬. ‫هﻤﭽﻨﻴﻦ در ﮐﺪ زﻳﺮ ﺑﺎﻳﺴﺘﯽ ﻣﺮﺣﻠﻪ اﻧﺘﺨﺎب ﺗﺮﻣﻴﻨﺎل را ﻧﻴﺰ اﻧﺠﺎم دهﻴﺪ‬
: ‫ دادﻩ ﻣﯽ ﺷﻮد‬event Handler ‫ ﺑﻪ‬TAPI ‫ اﺳﺖ ﮐﻪ ﺗﻮﺳﻂ‬ITCallNotificationEvent ‫اﺷﺎرﻩ ﮔﺮ ﺑﺮای واﺳﻂ‬

If TapiEvent = TE_CALLNOTIFICATION Then


objCallNotificationEvent As ITCallNotificationEvent Dim
objCallNotificationEvent = pEvent Set
ITCallInfo Dim gobjReceivedCallInfo As
Set gobjReceivedCallInfo = objCallNotificationEvent.Call
objCallControl As ITBasicCallControl Dim
gobjReceivedCallInfo = Set objCallControl
objCallControl.Answer
End If

http://sheidaian.persianblog.com

Anda mungkin juga menyukai