DSocket.cpp
上传用户:panstart
上传日期:2022-04-12
资源大小:199k
文件大小:7k
源码类别:

IP电话/视频会议

开发平台:

C++ Builder

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //
  4. //    Project     : VideoNet version 1.1.
  5. //    Description : Peer to Peer Video Conferencing over the LAN.
  6. //   Author      : Nagareshwar Y Talekar ( nsry2002@yahoo.co.in)
  7. //    Date        : 15-6-2004.
  8. //
  9. //
  10. //    File description : 
  11. //    Name    : DSocket.cpp
  12. //    Details : Datagram Socket for communication
  13. //
  14. //
  15. // ***  Control Packet Format ***
  16. //  Type : 1 byte
  17. //  Length of hostname : 1 byte
  18. //  Hostname : <var>
  19. //
  20. // ***  Text packet format ***
  21. //       Type               : 1 byte
  22. //  Length of hostname : 1 byte
  23. //  Hostname           : < var>
  24. //       Length of message  : 2 byte
  25. //  Message            : <var>
  26. //
  27. // ***  Audio packet format ***
  28. //       Type   : 1 byte
  29. //  Length of hostname   : 1 byte
  30. //  Hostname             : < var>
  31. //       size of audio data   : 2 byte
  32. //  Audio data           : <var>
  33. //
  34. // ***  Video packet format ***
  35. //       Type                 : 1 byte
  36. //  Length of hostname   : 1 byte
  37. //  Hostname             : < var>
  38. //       size of video data   : 2 byte
  39. //  Video data           : <var>
  40. //
  41. //
  42. //
  43. /////////////////////////////////////////////////////////////////////////////
  44. #include "stdafx.h"
  45. #include "VideoNet.h"
  46. #include "DSocket.h"
  47. #include "VideoNetDlg.h"
  48. #include "RequestDlg.h"
  49. #ifdef _DEBUG
  50. #define new DEBUG_NEW
  51. #undef THIS_FILE
  52. static char THIS_FILE[] = __FILE__;
  53. #endif
  54. /////////////////////////////////////////////////////////////////////////////
  55. // DSocket
  56. // Initialize static members...
  57. char DSocket::remoteaddress[500]="";
  58. char DSocket::remotename[500]="";
  59. unsigned char DSocket::data[2000];
  60. unsigned char DSocket::vdata[30000];
  61. unsigned char DSocket::adata[5000];
  62. unsigned int DSocket::length=2000;
  63. unsigned int DSocket::vlength=30000;
  64. unsigned int DSocket::alength=5000;
  65. DSocket::DSocket()
  66. {
  67. }
  68. DSocket::~DSocket()
  69. {
  70. }
  71. // Do not edit the following lines, which are needed by ClassWizard.
  72. #if 0
  73. BEGIN_MESSAGE_MAP(DSocket, CSocket)
  74. //{{AFX_MSG_MAP(DSocket)
  75. //}}AFX_MSG_MAP
  76. END_MESSAGE_MAP()
  77. #endif // 0
  78. /////////////////////////////////////////////////////////////////////////////
  79. // DSocket member functions
  80. /**
  81. *    Creates datagram socket on specified port 
  82. *    @param port Port on which datagram socket is created
  83. *    @param type type indicates the purpose of this socket
  84. * which can be control, audio or video.
  85. */
  86. void DSocket::CreateSocket(int port,int dtype)
  87. {
  88. this->Create(port,SOCK_DGRAM);
  89. type=dtype;
  90. // Get host name...
  91. gethostname(localname,300);
  92. }
  93. void DSocket::SetParent(CDialog *dlg)
  94. {
  95. pdlg=dlg;
  96. }
  97. /**
  98. *    Invoked when any data arrives from the remote host
  99. *
  100. */
  101. void DSocket::OnReceive(int errcode)
  102. {
  103. CString address;
  104. char hname[400],str[1000],mesg[500];
  105. unsigned int port,retvalue;
  106. int n,len;
  107. RequestDlg rdlg(NULL);
  108. // Note : if no error has occured then RETVALUE contains
  109. //   the COUNT of actual bytes received.
  110. // Control type 
  111. if(type==TYPE_CONTROL)
  112. {
  113. retvalue=this->ReceiveFrom(data,length,address,port);
  114. if(retvalue==SOCKET_ERROR)
  115. return;
  116. // Get host name from the data.
  117. for(int i=0;i<data[1];i++)
  118. hname[i]=data[i+2];
  119. hname[i]=0;
  120. strcpy(remotename,hname);
  121. strcpy(remoteaddress,(LPCTSTR)address);
  122. switch(data[0])
  123. {
  124. // action   : Remote user has sent the invitation for conference
  125. // reaction : accept/reject the invitation
  126. case MESG_CONNECT:
  127. // display the accept , reject dialog box
  128. rdlg.SetParameter(remotename,remoteaddress,pdlg);
  129. rdlg.DoModal();
  130. return;
  131. // action   : Remote user has disconnected
  132. // reaction : destroy the conference
  133. case MESG_DISCONNECT:
  134. ( (CVideoNetDlg*)pdlg)->DestroyConference();
  135. sprintf(str,"User %s has disconnected",hname);
  136. AfxMessageBox(str);
  137. return;
  138. // action   : Remote user has accepted the invitation
  139. // reaction : start the conference
  140. case MESG_ACCEPT:
  141. AfxMessageBox("User has accepted the connection");
  142. ( (CVideoNetDlg*)pdlg)->StartConference();
  143. return;
  144. // action   : Remote user has rejected the invitation
  145. // reaction : what to do...?
  146. case MESG_REJECT:
  147. sprintf(str,"User %s has rejected your invitation",hname);
  148. AfxMessageBox(str);
  149. return;
  150. }
  151. return;
  152. }
  153. if(type==TYPE_AUDIO)
  154. {
  155. retvalue=this->ReceiveFrom(adata,alength,address,port);
  156. if(retvalue==SOCKET_ERROR)
  157. return;
  158. // Play the audio
  159. ((CVideoNetDlg *)pdlg)->play->PostThreadMessage(WM_PLAYSOUND_PLAYBLOCK,retvalue,(LPARAM)adata);
  160. return;
  161. }
  162. if(type==TYPE_VIDEO)
  163. {
  164. retvalue=this->ReceiveFrom(vdata,vlength,address,port);
  165. if(retvalue==SOCKET_ERROR)
  166. return;
  167. ((CVideoNetDlg *)pdlg)->DisplayRemoteFrame(vdata,retvalue);
  168. return;
  169. }
  170. if(type==TYPE_TEXT)
  171. {
  172. retvalue=this->ReceiveFrom(data,length,address,port);
  173. if(retvalue==SOCKET_ERROR)
  174. return;
  175. // Get host name from the data.
  176. // Length of username
  177. n=data[1];
  178. for(int i=0;i<n;i++)
  179. hname[i]=data[i+2];
  180. hname[i]=0;
  181. len=data[n+2] | ( data[n+3]<<8 );
  182. memcpy(mesg,&data[n+4],len);
  183. mesg[len]=0;
  184. sprintf(str,"%s >> %s ",hname,mesg);
  185. // Display message in list box
  186. ((CVideoNetDlg *)pdlg)->DisplayMesg(str);
  187. return;
  188. }
  189. }
  190. /**
  191. *       Send the control data to remote host
  192. *
  193. *
  194. */
  195. void DSocket::SendControlMessage(int type,char *address)
  196. {
  197. char data[1000];
  198. int n;
  199. // Prepare the data packet 
  200. // Type of control packet
  201. data[0]=type;
  202. // Length of hostname
  203. n=strlen(localname);
  204. data[1]=n;
  205. // Name of the sender host
  206. memcpy(&data[2],localname,n);
  207. if(address==NULL)
  208. {
  209. SendTo(data,n+2,PORT_CONTROL,remoteaddress);
  210. }
  211. else
  212. {
  213. SendTo(data,n+2,PORT_CONTROL,address);
  214. }
  215. }
  216. /**
  217. *       Send the audio data to remote host
  218. *
  219. */
  220. void DSocket::SendAudioData(unsigned char *data,int length)
  221. {
  222. SendTo(data,length,PORT_AUDIO,remoteaddress);
  223. }
  224. /**
  225. *      Send the VIDEO data to remote host
  226. *
  227. */
  228. void DSocket::SendVideoData(unsigned char *data,int length)
  229. {
  230. // Better to attach video header....
  231. // If dynamic format is supported...
  232. SendTo(data,length,PORT_VIDEO,remoteaddress);
  233. }
  234. /**
  235. *      Send the TEXT data to remote host
  236. *
  237. */
  238. void DSocket::SendTextData(unsigned char *data,short length)
  239. {
  240. unsigned char *packet=new unsigned char[length+500];
  241. int n;
  242. // Text message
  243. packet[0]=TYPE_TEXT;
  244. // Length of hostname
  245. n=strlen(localname);
  246. packet[1]=n;
  247. // Hostname
  248. memcpy(&packet[2],localname,n);
  249. // Data length
  250. packet[n+2]=(unsigned char) length;
  251. packet[n+3]=(unsigned char) (length>>8);
  252. // Data
  253. memcpy(&packet[n+4],data,length);
  254. SendTo(packet,n+4+length,PORT_TEXT,remoteaddress);
  255. }
  256. /**
  257. *    Closes the socket created by the createsocket method
  258. *
  259. */
  260. void DSocket::CloseSocket()
  261. {
  262. DSocket::Close();
  263. }