📄 socket.lst
字号:
#endif
262 3 }
263 2 // 3. write SOCK_INIT commnad
264 2 IINCHIP_WRITE(COMMAND(s),CSOCKINIT);
265 2 ret = 1;
266 2 }
267 1 else
268 1 {
269 2 ret = 0;
270 2 }
271 1 return ret;
272 1 }
273
274 void close(unsigned char s)
275 {
276 1 IINCHIP_WRITE(COMMAND(s),CCLOSE);
277 1 }
278
279 unsigned int select(unsigned char s, unsigned char func)
280 {
281 1 unsigned int val;
282 1
283 1 switch (func)
284 1 {
285 2 case SEL_CONTROL :
286 2 val = (unsigned int)IINCHIP_READ(SOCK_STATUS(s));
287 2 break;
288 2 case SEL_SEND :
289 2 #ifndef _LITTLE_ENDIAN_
290 2 val = IINCHIP_READ(TX_FREE_SIZE_PTR(s));
291 2 val = (val << 8) + IINCHIP_READ(TX_FREE_SIZE_PTR(s) + 1);
292 2 #else
val = IINCHIP_READ(TX_FREE_SIZE_PTR(s)+1);
val = (val << 8) + IINCHIP_READ(TX_FREE_SIZE_PTR(s));
#endif
296 2 break;
297 2 case SEL_RECV :
C51 COMPILER V6.21 SOCKET 05/04/2005 09:30:04 PAGE 6
298 2 #ifndef _LITTLE_ENDIAN_
299 2 val = IINCHIP_READ(RX_RECV_SIZE_PTR(s));
300 2 val = (val << 8) + IINCHIP_READ(RX_RECV_SIZE_PTR(s) + 1);
301 2 #else
val = IINCHIP_READ(RX_RECV_SIZE_PTR(s)+1);
val = (val << 8) + IINCHIP_READ(RX_RECV_SIZE_PTR(s));
#endif
305 2 break;
306 2 default :
307 2 val = 0;
308 2 break;
309 2 }
310 1 return val;
311 1 }
312
313 /*---------------*/
314 #ifdef __TCP_CLIENT__
/**
* return :
* 1 => success
* 0 => fail
*/
unsigned char connect(unsigned char s, unsigned char * addr, unsigned int port)
{
unsigned char ret;
if
(
((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) ||
((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
(port == 0x00)
)
{
ret = 0;
}
else
{
// 1. write destination IP
IINCHIP_WRITE(DST_IP_PTR(s),addr[0]);
IINCHIP_WRITE((DST_IP_PTR(s) + 1),addr[1]);
IINCHIP_WRITE((DST_IP_PTR(s) + 2),addr[2]);
IINCHIP_WRITE((DST_IP_PTR(s) + 3),addr[3]);
// 2. write destination Port number
#ifndef _LITTLE_ENDIAN_
IINCHIP_WRITE(DST_PORT_PTR(s),(unsigned char)((port & 0xff00) >> 8));
IINCHIP_WRITE((DST_PORT_PTR(s) + 1),(unsigned char)(port & 0x00ff));
#else
IINCHIP_WRITE((DST_PORT_PTR(s)+1),(unsigned char)((port & 0xff00) >> 8));
IINCHIP_WRITE(DST_PORT_PTR(s),(unsigned char)(port & 0x00ff));
#endif
// 3. write CONNECT command
IINCHIP_WRITE(COMMAND(s),CCONNECT);
ret = 1;
}
// blocking mode, if you want to change non-blocking mode, comment these section.
/*----*/
while (1)
{
switch (IINCHIP_READ(SOCK_STATUS(s)))
{
case SOCK_ESTABLISHED : return 1;
case SOCK_CLOSED : return -1;
C51 COMPILER V6.21 SOCKET 05/04/2005 09:30:04 PAGE 7
default :
break;
}
wait_1us(1);
}
/*----*/
}
#endif
368
369 /*---------------*/
370 #ifdef __TCP_SERVER__
371 void NBlisten(unsigned char s)
372 {
373 1 IINCHIP_WRITE(COMMAND(s),CLISTEN);
374 1 }
375 #endif
376
377 /*---------------*/
378 #ifdef __TCP__
379 void disconnect(unsigned char s)
380 {
381 1 IINCHIP_WRITE(COMMAND(s),CDISCONNECT);
382 1 }
383
384
385 /**
386 * return
387 * n => count of sending data
388 * 0 => fail to send
389 */
390 unsigned int send(unsigned char s, const unsigned char *buf, unsigned int len)
391 {
392 1 unsigned int ret, size;
393 1 ret = 0;
394 1 while (len > 0)
395 1 {
396 2 size = send_in(s, buf + ret, len, 0x00);
397 2 if (size == 0) return 0;
398 2 len -= size;
399 2 ret += size;
400 2 }
401 1 return ret;
402 1 }
403
404 /**
405 * return
406 * n => count of receving data
407 * attention
408 * len => 捞固 捞窃荐 龋免傈俊 罐篮 荤捞令甫 备秦 弊蔼 捞窍狼 蔼阑 持绢林绢具 茄促.
409 * 捞犯霸 窍瘤 臼扁 困秦辑绰, 窃荐救俊辑 促矫 荐脚荤捞令甫 眉农窍绰 内靛啊 眠啊登绢具 茄促.
410 */
411 unsigned int recv(unsigned char s, const unsigned char * buf, unsigned int len)
412 {
413 1 unsigned int rd_ptr;
414 1 unsigned int ret;
415 1 if ( len > 0 )
416 1 {
417 2 // 1. get current rd_prt
418 2 #ifndef _LITTLE_ENDIAN_
419 2 rd_ptr = IINCHIP_READ(RX_RD_PTR(s));
420 2 rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s) + 1);
421 2 #else
C51 COMPILER V6.21 SOCKET 05/04/2005 09:30:04 PAGE 8
rd_ptr = IINCHIP_READ(RX_RD_PTR(s)+1);
rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s));
#endif
425 2 // 2. copy data as len
426 2 ret = read_data(s, (unsigned char *)rd_ptr, buf, len);
427 2 // 3. update rd_ptr
428 2 rd_ptr = rd_ptr + len;
429 2 #ifndef _LITTLE_ENDIAN_
430 2 IINCHIP_WRITE(RX_RD_PTR(s),(unsigned char)((rd_ptr & 0xff00) >> 8));
431 2 IINCHIP_WRITE((RX_RD_PTR(s) + 1),(unsigned char)(rd_ptr & 0x00ff));
432 2 #else
IINCHIP_WRITE((RX_RD_PTR(s)+1),(unsigned char)((rd_ptr & 0xff00) >> 8));
IINCHIP_WRITE(RX_RD_PTR(s),(unsigned char)(rd_ptr & 0x00ff));
#endif
436 2 IINCHIP_WRITE(COMMAND(s),CRECV);
437 2 }
438 1 return ret;
439 1 }
440 #endif // __TCP__
441
442
443 /*---------------*/
444 #ifdef __UDP__
/**
* return
* n => count of sending data
*/
unsigned int sendto(unsigned char s, const unsigned char * buf, unsigned int len, unsigned char * addr, un
-signed int port)
{
unsigned int ret;
if
(
((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
(port == 0x00)
)
{
ret = 0;
}
else
{
IINCHIP_WRITE(DST_IP_PTR(s),addr[0]);
IINCHIP_WRITE((DST_IP_PTR(s) + 1),addr[1]);
IINCHIP_WRITE((DST_IP_PTR(s) + 2),addr[2]);
IINCHIP_WRITE((DST_IP_PTR(s) + 3),addr[3]);
IINCHIP_WRITE(DST_PORT_PTR(s),(unsigned char)((port & 0xff00) >> 8));
IINCHIP_WRITE((DST_PORT_PTR(s) + 1),(unsigned char)(port & 0x00ff));
ret = send_in(s, buf, len, 0x00);
}
return ret;
}
/**
* return
* n => count of receiving data
* attention
* UDP牢 版快 茄 菩哦 窜困肺 贸府窍霸 等促.
* 溜, len沥焊俊 1000阑 利菌歹扼档, 茄菩哦捞 500捞搁 500阑 府畔窍绊 辆丰茄促.
*/
unsigned int recvfrom(unsigned char s, const unsigned char * buf, unsigned int len, unsigned char * addr,
-unsigned int * port)
{
C51 COMPILER V6.21 SOCKET 05/04/2005 09:30:04 PAGE 9
unsigned char xdata head[8];
unsigned int data_len;
unsigned int rd_ptr;
unsigned char * recv_ptr;
data_len = 0;
#ifndef _LITTLE_ENDIAN_
rd_ptr = IINCHIP_READ(RX_RD_PTR(s));
rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s) + 1);
#else
rd_ptr = IINCHIP_READ(RX_RD_PTR(s)+1);
rd_ptr = ((rd_ptr & 0x00ff) << 8) + IINCHIP_READ(RX_RD_PTR(s));
#endif
recv_ptr = (unsigned char *)(rd_ptr);
switch (IINCHIP_READ(OPT_PROTOCOL(s)) & 0x07)
{
case SOCK_DGRAM :
read_data(s, recv_ptr, head, 0x08);
// read peer's IP address, port number.
addr[0] = head[0];
addr[1] = head[1];
addr[2] = head[2];
addr[3] = head[3];
*port = head[4];
*port = (*port << 8) + head[5];
data_len = head[6];
data_len = (data_len << 8) + head[7];
rd_ptr = rd_ptr + data_len + 8;
recv_ptr += 8;
break;
case SOCK_IPL_RAWM :
read_data(s, recv_ptr, head, 0x06); // read header.
addr[0] = head[0];
addr[1] = head[1];
addr[2] = head[2];
addr[3] = head[3];
data_len = head[4];
data_len = (data_len << 8) + head[5];
rd_ptr = rd_ptr + data_len + 6;
recv_ptr += 6;
break;
default :
printf("No support protocol in recvfrom()\r\n");
return 0;
break;
}
if (data_len > len) data_len = len;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -