kb_machblue_core_socket.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:12k
源码类别:

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //File Name: kb_machblue_core_socket.c
  3. //
  4. //Description: socket function
  5. //
  6. // used by Machblue to access the platform's socket api
  7. //
  8. //Author: steven
  9. //
  10. //Date:  2006.12.29
  11. //
  12. //Version:  v1.0
  13. //*****************************************************************************
  14. #include "osp.h"
  15. #include "tcpip.h"
  16. #include "machblue_defines.h"
  17. #include "machblue_customer.h"
  18. #include "machblue_porting_core.h"
  19. #define SOCKET_BUF_LEN 1024
  20. typedef enum
  21. {
  22. sDataSend,
  23. sDataReceive,
  24. sDataNo
  25. }sStatus;
  26. typedef struct _nonBlockSocket_s
  27. {
  28. BOOL  used;
  29. BOOL dError;
  30. sStatus dSR;
  31. mb_socket_t  s;
  32. unsigned char buf[SOCKET_BUF_LEN];
  33. }nonBlockSocket_t;
  34. /*
  35.  * ======================= Assistant Function ===========================================
  36.  * realize non blocking mode
  37.  */
  38. #define SOCKET_NB_PRIORITY 3*16
  39. #define SOCKET_NB_NUM 50
  40.  
  41. static nonBlockSocket_t nbSocket[SOCKET_NB_NUM];
  42. /**
  43.  * init socket non blocking mode task
  44.  * @return MB_SUCCESS or MB_FAILURE.
  45.  */
  46. mb_error_t mb_socket_nb_init(void)
  47. {
  48. //unsigned long socketNbTId;
  49. //KB_OSPRet ret;
  50. unsigned int index;
  51. for(index=0;index<SOCKET_NB_NUM;index++)
  52. {
  53. nbSocket[index].s=MB_INVALID_SOCKET;
  54. nbSocket[index].used=FALSE;
  55. nbSocket[index].dError=FALSE;
  56. nbSocket[index].dSR=sDataNo;
  57. mb_memcpy(nbSocket[index].buf,"0xFF",SOCKET_BUF_LEN);
  58. }
  59. return MB_SUCCESS;
  60. }
  61. /**
  62.  * add non blocking socket status
  63.  * @return MB_SUCCESS or MB_FAILURE.
  64.  */
  65. mb_error_t mb_socket_nb_status_add(mb_socket_t s)
  66. {
  67. unsigned int index;
  68. for(index=0;index<SOCKET_NB_NUM;index++)
  69. {
  70. if(nbSocket[index].used==FALSE)
  71. break;
  72. }
  73. if(index==SOCKET_NB_NUM)
  74. {
  75. mb_printf("n[Machblue]:Socket nb add status error.");
  76. return MB_FAILURE;
  77. }
  78. nbSocket[index].s=s;
  79. nbSocket[index].used=TRUE;
  80. nbSocket[index].dError=FALSE;
  81. nbSocket[index].dSR=sDataNo;
  82. return MB_SUCCESS;
  83. }
  84. /**
  85.  * remove non blocking socket status
  86.  * @return MB_SUCCESS or MB_FAILURE.
  87.  */
  88. mb_error_t mb_socket_nb_status_remove(mb_socket_t s)
  89. {
  90. unsigned int index;
  91. for(index=0;index<SOCKET_NB_NUM;index++)
  92. {
  93. if(nbSocket[index].s==s)
  94. {
  95. nbSocket[index].s=MB_INVALID_SOCKET;
  96. nbSocket[index].used=FALSE;
  97. nbSocket[index].dError=FALSE;
  98. nbSocket[index].dSR=sDataNo;
  99. mb_memcpy(nbSocket[index].buf,"0xFF",SOCKET_BUF_LEN);
  100. }
  101. }
  102. return MB_SUCCESS;
  103. }
  104. /**
  105.  * set non blocking socket status
  106.  * @return MB_SUCCESS or MB_FAILURE.
  107.  */
  108. mb_error_t mb_socket_nb_status_set(mb_socket_t s,sStatus status)
  109. {
  110. unsigned int index;
  111. BOOL setStatus=FALSE;
  112. for(index=0;index<SOCKET_NB_NUM;index++)
  113. {
  114. if((nbSocket[index].s==s)&&(nbSocket[index].used))
  115. {
  116. nbSocket[index].dSR=status;
  117. setStatus=TRUE;
  118. break;
  119. }
  120. }
  121. if(setStatus==FALSE)
  122. {
  123. mb_printf("n[Machblue]:Socket nb set status error.");
  124. return MB_FAILURE;
  125. }
  126. return MB_SUCCESS;
  127. }
  128. /**
  129.  * set non blocking socket status
  130.  * @return MB_SUCCESS or MB_FAILURE.
  131.  */
  132. mb_error_t mb_socket_nb_error_set(mb_socket_t s,BOOL sError)
  133. {
  134. unsigned int index;
  135. //BOOL setStatus=FALSE;
  136. for(index=0;index<SOCKET_NB_NUM;index++)
  137. {
  138. if((nbSocket[index].s==s)&&(nbSocket[index].used))
  139. {
  140. nbSocket[index].dError=sError;
  141. break;
  142. }
  143. }
  144. return MB_SUCCESS;
  145. }
  146. /**
  147.  * get non blocking socket status
  148.  * @return MB_SUCCESS or MB_FAILURE.
  149.  */
  150. mb_error_t mb_socket_nb_error_get(mb_socket_t s,BOOL *sError)
  151. {
  152. unsigned int index;
  153. //BOOL getStatus=FALSE;
  154. for(index=0;index<SOCKET_NB_NUM;index++)
  155. {
  156. if((nbSocket[index].s==s)&&(nbSocket[index].used))
  157. {
  158. *sError=nbSocket[index].dError;
  159. break;
  160. }
  161. }
  162. return MB_SUCCESS;
  163. }
  164. /**
  165.  * get non blocking socket status
  166.  * @return MB_SUCCESS or MB_FAILURE.
  167.  */
  168. mb_error_t mb_socket_nb_status_get(mb_socket_t s,sStatus *status)
  169. {
  170. unsigned int index;
  171. BOOL getStatus=FALSE;
  172. for(index=0;index<SOCKET_NB_NUM;index++)
  173. {
  174. if((nbSocket[index].s==s)&&(nbSocket[index].used))
  175. {
  176. *status=nbSocket[index].dSR;
  177. getStatus=TRUE;
  178. break;
  179. }
  180. }
  181. if(getStatus==FALSE)
  182. {
  183. mb_printf("n[Machblue]:Socket nb get status error.");
  184. return MB_FAILURE;
  185. }
  186. return MB_SUCCESS;
  187. }
  188. /**
  189.  * get non blocking socket status
  190.  * @return MB_SUCCESS or MB_FAILURE.
  191.  */
  192. unsigned char *mb_socket_nb_buf_get(mb_socket_t s)
  193. {
  194. unsigned int index;
  195. for(index=0;index<SOCKET_NB_NUM;index++)
  196. {
  197. if((nbSocket[index].s==s)&&(nbSocket[index].used))
  198. {
  199. return nbSocket[index].buf;
  200. }
  201. }
  202. return NULL;
  203. }
  204. /**
  205.  * get host
  206.  * @return integer value of host,0 is failure
  207.  */
  208. unsigned long mb_socket_host_get(const mb_char_t *hostname)
  209. {
  210. unsigned long host=0x00000000,data=0;
  211. unsigned char index,validDcount=0,decimalIndex=0;
  212. for(index=0;index<50;index++)
  213. {
  214. //'.'
  215. if(hostname[index]==0x2E)
  216. {
  217. validDcount+=1;
  218. switch(validDcount)
  219. {
  220. case 1:
  221. host+=((data<<24)&0xFF000000);
  222. break;
  223. case 2:
  224. host+=((data<<16)&0xFF0000);
  225. break;
  226. case 3:
  227. host+=((data<<8)&0xFF00);
  228. break;
  229. }
  230. data=0;
  231. decimalIndex=0;
  232. continue;
  233. }
  234. //''
  235. if(hostname[index]==0x0)
  236. {
  237. validDcount+=1;
  238. if(validDcount==4)
  239. host+=(data&0xFF);
  240. break;
  241. }
  242. data=data*(unsigned long)decimalIndex+(unsigned long)((unsigned long)hostname[index]-48);
  243. if(decimalIndex==0)
  244. decimalIndex=10;
  245. }
  246. if(validDcount!=4)
  247. {
  248. mb_printf("n[Machblue]:Socket get host error.");
  249. return 0;
  250. }
  251. return host;
  252. }
  253. /**
  254.  * Creates a new communication socket.
  255.  * s < pointer to socket to create >
  256.  * socket_type   < socket type to create >
  257.  
  258.  * @return MB_SCCESS and updates "s" on success or MB_FAILURE on failure.
  259.  */
  260. mb_error_t mb_socket_create(mb_socket_t *s,mb_socket_type_t socket_type)
  261. {
  262. int sType,dSocket;
  263.     if(socket_type==MB_SOCKET_TYPE_STREAM)
  264. sType=SOCK_STREAM ;
  265.     else
  266.        sType=SOCK_DGRAM ;
  267.     dSocket=socket(AF_INET,sType,0);
  268. if(dSocket<0)
  269. {
  270. mb_printf("n[Machblue]:Socket create error.");
  271. return MB_FAILURE;
  272. }
  273. if(mb_socket_nb_status_add((mb_socket_t)dSocket)==MB_FAILURE)
  274. {
  275. mb_printf("n[Machblue]:Socket create add status error.");
  276. return MB_FAILURE;
  277. }
  278. *s=(mb_socket_t)dSocket;
  279.     return MB_SUCCESS;
  280. }
  281. /**
  282.  * Deletes a new communication socket.
  283.  * s   < socket to delete >
  284.  
  285.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  286.  */
  287. mb_error_t mb_socket_delete(mb_socket_t s)
  288. {
  289. if(s==MB_INVALID_SOCKET)
  290. {
  291. mb_printf("n[Machblue]:Socket delete error.");
  292. return MB_FAILURE;
  293. }
  294. mb_socket_nb_status_remove(s);
  295. return MB_SUCCESS;
  296. }
  297. /**
  298.  * Connects a stream socket to a remote host.
  299.  * s < socket to connect >
  300.  * hostname < tcp/ip hostname of the host to connect to >
  301.  * port       < tcp/ip port to connect to >
  302.  
  303.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  304.  */
  305. mb_error_t mb_socket_connect(mb_socket_t s,const mb_char_t *hostname,unsigned int port)
  306. {
  307.     struct sockaddr_in addr;
  308.    
  309.     mb_memset(&addr,0,sizeof(struct sockaddr_in));
  310.     addr.sin_family=AF_INET;
  311.     addr.sin_port=htons(port);
  312.     addr.sin_addr.s_addr=(u32)mb_socket_host_get(hostname);
  313.     if(connect((int)s,(struct sockaddr*)&addr,(int)sizeof(struct sockaddr_in))!=0) 
  314. {
  315. mb_printf("n[Machblue]:Socket connect error.");
  316. return MB_FAILURE;
  317. }
  318. if(fcntl((int)s,(int)1,(int)2)!=0)
  319. {
  320. mb_socket_disconnect(s);
  321. mb_printf("n[Machblue]:Socket connect mode switch error.");
  322. return MB_FAILURE;
  323. }
  324.     return MB_SUCCESS;
  325. }
  326. #define SHUTDOWN_RECEIVE 0
  327. #define SHUTDOWN_SEND 1
  328. #define SHUTDOWN_ALL 2
  329. /**
  330.  * Disconnects a stream socket from a remote host. It is legal
  331.  * for the client to disconnect a socket already disconnected by the
  332.  * server (and vice-versa).
  333.  *
  334.  * s  < socket to disconnect >
  335.  
  336.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  337.  */
  338. mb_error_t mb_socket_disconnect(mb_socket_t s)
  339. {
  340. int ret;
  341.     ret=shutdown((int)s,(int)SHUTDOWN_ALL);
  342. if(ret!=1)
  343. {
  344. mb_printf("n[Machblue]:Socket disconnect shutdown error.");
  345. return MB_FAILURE;
  346. }
  347. ret=close((int)s);
  348. if(ret!=1)
  349. {
  350. mb_printf("n[Machblue]:Socket disconnect close error.");
  351. return MB_FAILURE;
  352. }
  353.    
  354.     return MB_SUCCESS;
  355. }
  356. /**
  357.  * Polls a socket for a given event.
  358.  * s < socket to poll >
  359.  * event  < event to poll for >
  360.  
  361.  * @return MB_SUCCESS if the event condition polled for is current, MB_FAILURE otherwise.
  362.  */
  363. mb_error_t mb_socket_poll(mb_socket_t s,mb_socket_event_t event)
  364. {
  365. mb_error_t ret;
  366. BOOL sError;
  367. sStatus status;
  368.   ret=mb_socket_nb_status_get(s,&status);
  369. if(ret!=MB_SUCCESS)
  370. {
  371. mb_printf("n[Machblue]:Socket poll get status error.");
  372. return MB_FAILURE;
  373. }
  374. switch(event)
  375. {
  376. case MB_SOCKET_EVENT_DATA_IN:
  377. //socket is sending data
  378. if(status==sDataSend)
  379. {
  380. mb_printf("n[Machblue]:Socket poll data in error.");
  381. return MB_FAILURE;
  382. }
  383. else
  384. {
  385. int size;
  386. unsigned char *buf=mb_socket_nb_buf_get(s);
  387. if(buf==NULL)
  388. {
  389. mb_printf("n[Machblue]:Socket poll data in buf NULL.");
  390. return MB_FAILURE;
  391. }
  392. size=recv((int)s,(void*)buf,(int)1,(unsigned int)0);
  393. if(size!=1)
  394. {
  395. mb_printf("n[Machblue]:Socket poll data in data NULL.");
  396. return MB_FAILURE;
  397. }
  398. mb_socket_nb_status_set(s,sDataReceive);
  399. return MB_SUCCESS;
  400. }
  401.      case MB_SOCKET_EVENT_DATA_OUT:
  402. //socket is receiving data
  403. if(status==sDataReceive)
  404. {
  405. mb_printf("n[Machblue]:Socket poll data out error.");
  406. return MB_FAILURE;
  407. }
  408. else
  409. {
  410. mb_socket_nb_status_set(s,sDataSend);
  411. return MB_SUCCESS;
  412. }
  413.      case MB_SOCKET_EVENT_ERROR:
  414. mb_socket_nb_error_get(s,&sError);
  415. if(sError)
  416. {
  417. mb_socket_nb_error_set(s,FALSE);
  418. return MB_SUCCESS;
  419. }
  420. else
  421. return MB_FAILURE;
  422. default:
  423. mb_printf("n[Machblue]:Socket poll event type error.");
  424. }
  425. return MB_FAILURE;
  426. }
  427. /**
  428.  * Sends data over a connected stream socket.
  429.  * s < socket to send data on >
  430.  * msg < message to  send >
  431.  * length   < size of the message to send in bytes >
  432.  
  433.  * @return the amount of data sent on success and a strcitly negative number on failure.
  434.  */
  435. mb_ssize_t mb_socket_send(mb_socket_t s,const void *msg,mb_size_t length)
  436. {
  437. //mb_error_t ret;
  438. //KB_OSPMsgNode nbMsg;
  439. int size;
  440. unsigned char *buf=mb_socket_nb_buf_get(s);
  441. if(buf==NULL)
  442. {
  443. mb_printf("n[Machblue]:Socket poll data in buf NULL.");
  444. return (mb_ssize_t)0;
  445. }
  446. size=send((int)s,(void*)buf,(int)length,(unsigned int)0);
  447. if(size==-1)
  448. {
  449. mb_socket_nb_error_set(s,TRUE);
  450. return (mb_ssize_t)0;
  451. }
  452. if(size==length)
  453. mb_socket_nb_status_set(s,sDataNo);
  454. return (mb_ssize_t)size;
  455. }
  456. /**
  457.  * Receives data from a connected stream socket.
  458.  * s < socket to receive data from >
  459.  * buf < buffer to receive data in >
  460.  * length  < length in bytes of buffer >
  461.  
  462.  * @return the amount of data read on success and a strcitly negative number on failure.
  463.  */
  464. mb_ssize_t mb_socket_recv(mb_socket_t s,void *buf,mb_size_t length)
  465. {
  466. //mb_error_t ret;
  467. int size;
  468. unsigned char *sBuf=mb_socket_nb_buf_get(s);
  469. unsigned short rLen=length-1;
  470. if(length==1)
  471. {
  472. mb_memcpy(buf,sBuf,1);
  473. mb_socket_nb_status_set(s,sDataNo);
  474. return length;
  475. }
  476. else
  477. {
  478. if(length>SOCKET_BUF_LEN)
  479. rLen=SOCKET_BUF_LEN-1;
  480. size=recv((int)s,(void*)&sBuf[1],(int)1,(unsigned int)0);
  481. if(size==-1)
  482. {
  483. mb_socket_nb_error_set(s,TRUE);
  484. return (mb_ssize_t)0;
  485. }
  486. mb_memcpy(buf,sBuf,size+1);
  487. if((size==(length-1))&&(length<=SOCKET_BUF_LEN))
  488. mb_socket_nb_status_set(s,sDataNo);
  489. return (mb_ssize_t)size;
  490. }
  491. }
  492. /**
  493.  * socket init
  494.  * @return MB_SUCCESS or MB_FAILURE.
  495.  */
  496. mb_error_t mb_socket_init(void)
  497. {
  498. unsigned char hwMac[6]={'00','11','22','33','44','55'};
  499. unsigned long ip,mask,gw;
  500. int ret;
  501. if(mb_socket_nb_init()!=MB_SUCCESS)
  502. {
  503. mb_printf("n[Machblue]:Socket init error.");
  504. return MB_FAILURE;
  505. }
  506. ip=0xC0A80170;
  507. mask=0xFFFFFF00;
  508. gw=0xC0A80101;
  509. ret=netif_init((unsigned int)ip,(unsigned int)mask,(unsigned int)gw,hwMac);
  510. if(ret!=1)
  511. {
  512. mb_printf("n[Machblue]:Socket init error.");
  513. return MB_FAILURE;
  514. }
  515. return  MB_SUCCESS;
  516. }