From f9ec093f5147bc4e24e0d2d95f4300e6b646c1f8 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Mon, 7 Aug 2017 11:36:22 +0800 Subject: correct some explain --- examples/network/tcpsendpacket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index 50841e0149..c4604f1079 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -19,9 +19,9 @@ void tcp_senddata(const char* url, int port, int length) return; } - /* 神奇内存 */ + /* 申请内存 */ buffer_ptr = rt_malloc(length); - /* 构造发生数据 */ + /* 构造发送数据 */ for (index = 0; index < length; index ++) buffer_ptr[index] = index & 0xff; -- cgit v1.3.1 From 07cc5047bb4b92f3a0a95df1e1f95f2cac7b9cd9 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 10 Aug 2017 10:46:47 +0800 Subject: Complete some error handling when send or receive function returns a value is zero. --- examples/network/tcpclient.c | 26 +++++++++++++++++++++----- examples/network/tcpsendpacket.c | 6 +++++- examples/network/tcpserver.c | 24 ++++++++++++++++++++---- 3 files changed, 46 insertions(+), 10 deletions(-) (limited to 'examples') diff --git a/examples/network/tcpclient.c b/examples/network/tcpclient.c index 7a0d4b5365..529c612b9a 100644 --- a/examples/network/tcpclient.c +++ b/examples/network/tcpclient.c @@ -10,6 +10,7 @@ void tcpclient(const char* url, int port) char *recv_data; struct hostent *host; int sock, bytes_received; + int ret; struct sockaddr_in server_addr; /* 閫氳繃鍑芥暟鍏ュ彛鍙傛暟url鑾峰緱host鍦板潃锛堝鏋滄槸鍩熷悕锛屼細鍋氬煙鍚嶈В鏋愶級 */ @@ -56,15 +57,19 @@ void tcpclient(const char* url, int port) { /* 浠巗ock杩炴帴涓帴鏀舵渶澶UFSZ - 1瀛楄妭鏁版嵁 */ bytes_received = recv(sock, recv_data, BUFSZ - 1, 0); - if (bytes_received <= 0) + if (bytes_received < 0) { /* 鎺ユ敹澶辫触锛屽叧闂繖涓繛鎺� */ lwip_close(sock); - + rt_kprintf("\nreceived error,close the socket.\r\n"); /* 閲婃斁鎺ユ敹缂撳啿 */ rt_free(recv_data); break; - } + }else if (bytes_received == 0) + { + /* 鎵撳嵃recv鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\nReceived warning,recv function return 0.\r\n"); + } /* 鏈夋帴鏀跺埌鏁版嵁锛屾妸鏈娓呴浂 */ recv_data[bytes_received] = '\0'; @@ -73,7 +78,7 @@ void tcpclient(const char* url, int port) { /* 濡傛灉鏄瀛楁瘝鏄痲鎴朡锛屽叧闂繖涓繛鎺� */ lwip_close(sock); - + rt_kprintf("\n got a 'q' or 'Q',close the socket.\r\n"); /* 閲婃斁鎺ユ敹缂撳啿 */ rt_free(recv_data); break; @@ -85,7 +90,18 @@ void tcpclient(const char* url, int port) } /* 鍙戦�佹暟鎹埌sock杩炴帴 */ - send(sock,send_data,strlen(send_data), 0); + ret = send(sock,send_data,strlen(send_data), 0); + if (ret < 0) + { + /* 鎺ユ敹澶辫触锛屽叧闂繖涓繛鎺� */ + lwip_close(sock); + rt_kprintf("\nsend error,close the socket.\r\n"); + break; + }else if (ret == 0) + { + /* 鎵撳嵃send鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\n Send warning,send function return 0.\r\n"); + } } return; diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index c4604f1079..ec23a15d23 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -51,7 +51,11 @@ void tcp_senddata(const char* url, int port, int length) rt_kprintf("TCP Socket error:%d\n",sock); err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); rt_kprintf("TCP thread connect error code: %d\n", err); - } + }else if (result == 0) + { + /* 打印send函数返回值为0的警告信息 */ + rt_kprintf("\n Send warning,send function return 0.\r\n"); + } } } diff --git a/examples/network/tcpserver.c b/examples/network/tcpserver.c index 3f34bc2c29..e68d9e53f0 100644 --- a/examples/network/tcpserver.c +++ b/examples/network/tcpserver.c @@ -9,6 +9,7 @@ void tcpserv(void* parameter) int sock, connected, bytes_received; struct sockaddr_in server_addr, client_addr; rt_bool_t stop = RT_FALSE; /* 鍋滄鏍囧織 */ + int ret; recv_data = rt_malloc(1024); /* 鍒嗛厤鎺ユ敹鐢ㄧ殑鏁版嵁缂撳啿 */ if (recv_data == RT_NULL) @@ -72,16 +73,31 @@ void tcpserv(void* parameter) while (1) { /* 鍙戦�佹暟鎹埌connected socket */ - send(connected, send_data, strlen(send_data), 0); - + ret = send(connected, send_data, strlen(send_data), 0); + if (ret < 0) + { + /* 鎺ユ敹澶辫触锛屽叧闂繖涓繛鎺� */ + lwip_close(sock); + rt_kprintf("\nsend error,close the socket.\r\n"); + break; + }else if (ret == 0) + { + /* 鎵撳嵃send鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\n Send warning,send function return 0.\r\n"); + } + /* 浠巆onnected socket涓帴鏀舵暟鎹紝鎺ユ敹buffer鏄�1024澶у皬锛屼絾骞朵笉涓�瀹氳兘澶熸敹鍒�1024澶у皬鐨勬暟鎹� */ bytes_received = recv(connected,recv_data, 1024, 0); - if (bytes_received <= 0) + if (bytes_received < 0) { /* 鎺ユ敹澶辫触锛屽叧闂繖涓猚onnected socket */ lwip_close(connected); break; - } + }else if (bytes_received == 0) + { + /* 鎵撳嵃recv鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\nReceived warning,recv function return 0.\r\n"); + } /* 鏈夋帴鏀跺埌鏁版嵁锛屾妸鏈娓呴浂 */ recv_data[bytes_received] = '\0'; -- cgit v1.3.1 From 0d33799d0dcf2f2232f83f0bf92694ba54888b65 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 10 Aug 2017 11:03:06 +0800 Subject: add some python example for tcp server and client. --- examples/network/tcp_client.py | 16 ++++++++++++++++ examples/network/tcp_server.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 examples/network/tcp_client.py create mode 100644 examples/network/tcp_server.py (limited to 'examples') diff --git a/examples/network/tcp_client.py b/examples/network/tcp_client.py new file mode 100644 index 0000000000..d8ae125fdb --- /dev/null +++ b/examples/network/tcp_client.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +import socket + +s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) + +s.connect(('192.168.10.110',6001)) + +print s.recv(1024) + +for data in ['rtt_nano','rtt_thread','rtt_bsp']: + s.send(data) + print s.recv(1024) + +s.send('exit') +s.close() \ No newline at end of file diff --git a/examples/network/tcp_server.py b/examples/network/tcp_server.py new file mode 100644 index 0000000000..537e35e043 --- /dev/null +++ b/examples/network/tcp_server.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +#寮曞叆妯″潡 +import socket +import threading +import time +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +# 鐩戝惉绔彛: +s.bind(('192.168.10.110', 6001)) + +s.listen(5) +print 'Waiting for connection...' + +def tcp_link(sock,addr): + print 'Accept new connection from %s:%s...' % addr + sock.send('Welcome to RT-Thread!') + while True: + data=sock.recv(1024) + time.sleep(1) + if data=='exit' or not data: + break + print data + sock.send('Hello,%s!'%data) + sock.close() + print 'Connection from %s:%s closed.'%addr + +while True: + + #鎺ュ彈涓�涓柊杩炴帴 + sock,addr=s.accept() + + #鍒涘缓鏂扮嚎绋嬫潵澶勭悊TCP杩炴帴 + t=threading.Thread(target=tcp_link(sock,addr)) + -- cgit v1.3.1 From 5f4bcfa3e14fc00feb68754159ad67e9c5c4ac14 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 10 Aug 2017 14:09:57 +0800 Subject: [examples] code cleanup. --- examples/network/tcpclient.c | 42 +++++++++------- examples/network/tcpsendpacket.c | 103 ++++++++++++++++++++------------------- examples/network/tcpserver.c | 37 +++++++------- 3 files changed, 99 insertions(+), 83 deletions(-) (limited to 'examples') diff --git a/examples/network/tcpclient.c b/examples/network/tcpclient.c index 529c612b9a..c7a53c609f 100644 --- a/examples/network/tcpclient.c +++ b/examples/network/tcpclient.c @@ -1,16 +1,17 @@ #include -#include /* 涓轰簡瑙f瀽涓绘満鍚嶏紝闇�瑕佸寘鍚玭etdb.h澶存枃浠� */ + +#include /* 涓轰簡瑙f瀽涓绘満鍚嶏紝闇�瑕佸寘鍚玭etdb.h澶存枃浠� */ #include /* 浣跨敤BSD socket锛岄渶瑕佸寘鍚玸ockets.h澶存枃浠� */ -#define BUFSZ 1024 +#define BUFSZ 1024 static const char send_data[] = "This is TCP Client from RT-Thread."; /* 鍙戦�佺敤鍒扮殑鏁版嵁 */ void tcpclient(const char* url, int port) { + int ret; char *recv_data; struct hostent *host; int sock, bytes_received; - int ret; struct sockaddr_in server_addr; /* 閫氳繃鍑芥暟鍏ュ彛鍙傛暟url鑾峰緱host鍦板潃锛堝鏋滄槸鍩熷悕锛屼細鍋氬煙鍚嶈В鏋愶級 */ @@ -61,15 +62,18 @@ void tcpclient(const char* url, int port) { /* 鎺ユ敹澶辫触锛屽叧闂繖涓繛鎺� */ lwip_close(sock); - rt_kprintf("\nreceived error,close the socket.\r\n"); + rt_kprintf("\nreceived error,close the socket.\r\n"); + /* 閲婃斁鎺ユ敹缂撳啿 */ rt_free(recv_data); break; - }else if (bytes_received == 0) - { - /* 鎵撳嵃recv鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ - rt_kprintf("\nReceived warning,recv function return 0.\r\n"); - } + } + else if (bytes_received == 0) + { + /* 鎵撳嵃recv鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\nReceived warning,recv function return 0.\r\n"); + continue; + } /* 鏈夋帴鏀跺埌鏁版嵁锛屾妸鏈娓呴浂 */ recv_data[bytes_received] = '\0'; @@ -78,7 +82,8 @@ void tcpclient(const char* url, int port) { /* 濡傛灉鏄瀛楁瘝鏄痲鎴朡锛屽叧闂繖涓繛鎺� */ lwip_close(sock); - rt_kprintf("\n got a 'q' or 'Q',close the socket.\r\n"); + rt_kprintf("\n got a 'q' or 'Q',close the socket.\r\n"); + /* 閲婃斁鎺ユ敹缂撳啿 */ rt_free(recv_data); break; @@ -91,17 +96,20 @@ void tcpclient(const char* url, int port) /* 鍙戦�佹暟鎹埌sock杩炴帴 */ ret = send(sock,send_data,strlen(send_data), 0); - if (ret < 0) + if (ret < 0) { /* 鎺ユ敹澶辫触锛屽叧闂繖涓繛鎺� */ lwip_close(sock); - rt_kprintf("\nsend error,close the socket.\r\n"); + rt_kprintf("\nsend error,close the socket.\r\n"); + + rt_free(recv_data); break; - }else if (ret == 0) - { - /* 鎵撳嵃send鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ - rt_kprintf("\n Send warning,send function return 0.\r\n"); - } + } + else if (ret == 0) + { + /* 鎵撳嵃send鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\n Send warning,send function return 0.\r\n"); + } } return; diff --git a/examples/network/tcpsendpacket.c b/examples/network/tcpsendpacket.c index ec23a15d23..e7c514806e 100644 --- a/examples/network/tcpsendpacket.c +++ b/examples/network/tcpsendpacket.c @@ -1,62 +1,67 @@ #include -#include /* 为了解析主机名,需要包含netdb.h头文件 */ +#include /* 为了解析主机名,需要包含netdb.h头文件 */ #include /* 使用BSD socket,需要包含sockets.h头文件 */ void tcp_senddata(const char* url, int port, int length) { - struct hostent *host; - int sock, err, result, timeout, index; - struct sockaddr_in server_addr; - rt_uint8_t *buffer_ptr; + struct hostent *host; + int sock, err, result, timeout, index; + struct sockaddr_in server_addr; + rt_uint8_t *buffer_ptr; - /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ - host = gethostbyname(url); - /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ - if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) - { - /* 创建socket失败 */ - rt_kprintf("Socket error\n"); - return; - } + /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ + host = gethostbyname(url); + /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ + if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) + { + /* 创建socket失败 */ + rt_kprintf("Socket error\n"); + return; + } - /* 申请内存 */ - buffer_ptr = rt_malloc(length); - /* 构造发送数据 */ - for (index = 0; index < length; index ++) - buffer_ptr[index] = index & 0xff; + /* 申请内存 */ + buffer_ptr = rt_malloc(length); + /* 构造发送数据 */ + for (index = 0; index < length; index ++) + buffer_ptr[index] = index & 0xff; - timeout = 100; - /* 设置发送超时时间100ms */ - lwip_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); - /* 初始化预连接的服务端地址 */ - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(port); - server_addr.sin_addr = *((struct in_addr *)host->h_addr); - rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); + timeout = 100; + /* 设置发送超时时间100ms */ + lwip_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); + /* 初始化预连接的服务端地址 */ + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + server_addr.sin_addr = *((struct in_addr *)host->h_addr); + rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); - /* 连接到服务端 */ - err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); - rt_kprintf("TCP thread connect error code: %d\n", err); + /* 连接到服务端 */ + err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); + rt_kprintf("TCP thread connect error code: %d\n", err); - while(1) - { - /* 发送数据到sock连接 */ - result = send(sock, buffer_ptr, length, MSG_DONTWAIT); - if(result == -1) //数据发送错误处理 - { - rt_kprintf("TCP thread send error: %d\n", result); - lwip_close(sock); //关闭连接,重新创建连接 - rt_thread_delay(10); - if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) - rt_kprintf("TCP Socket error:%d\n",sock); - err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); - rt_kprintf("TCP thread connect error code: %d\n", err); - }else if (result == 0) - { - /* 打印send函数返回值为0的警告信息 */ - rt_kprintf("\n Send warning,send function return 0.\r\n"); - } - } + while(1) + { + /* 发送数据到sock连接 */ + result = send(sock, buffer_ptr, length, MSG_DONTWAIT); + if(result < 0) //数据发送错误处理 + { + rt_kprintf("TCP thread send error: %d\n", result); + lwip_close(sock); + + /* 关闭连接,重新创建连接 */ + rt_thread_delay(10); + + if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) + rt_kprintf("TCP Socket error:%d\n",sock); + + err = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); + rt_kprintf("TCP thread connect error code: %d\n", err); + } + else if (result == 0) + { + /* 打印send函数返回值为0的警告信息 */ + rt_kprintf("\n Send warning,send function return 0.\r\n"); + } + } } #ifdef RT_USING_FINSH diff --git a/examples/network/tcpserver.c b/examples/network/tcpserver.c index e68d9e53f0..c08949ea83 100644 --- a/examples/network/tcpserver.c +++ b/examples/network/tcpserver.c @@ -74,18 +74,19 @@ void tcpserv(void* parameter) { /* 鍙戦�佹暟鎹埌connected socket */ ret = send(connected, send_data, strlen(send_data), 0); - if (ret < 0) - { - /* 鎺ユ敹澶辫触锛屽叧闂繖涓繛鎺� */ - lwip_close(sock); - rt_kprintf("\nsend error,close the socket.\r\n"); - break; - }else if (ret == 0) - { - /* 鎵撳嵃send鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ - rt_kprintf("\n Send warning,send function return 0.\r\n"); - } - + if (ret < 0) + { + /* 鍙戦�佸け璐ワ紝鍏抽棴杩欎釜杩炴帴 */ + lwip_close(connected); + rt_kprintf("\nsend error,close the socket.\r\n"); + break; + } + else if (ret == 0) + { + /* 鎵撳嵃send鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\n Send warning,send function return 0.\r\n"); + } + /* 浠巆onnected socket涓帴鏀舵暟鎹紝鎺ユ敹buffer鏄�1024澶у皬锛屼絾骞朵笉涓�瀹氳兘澶熸敹鍒�1024澶у皬鐨勬暟鎹� */ bytes_received = recv(connected,recv_data, 1024, 0); if (bytes_received < 0) @@ -93,11 +94,13 @@ void tcpserv(void* parameter) /* 鎺ユ敹澶辫触锛屽叧闂繖涓猚onnected socket */ lwip_close(connected); break; - }else if (bytes_received == 0) - { - /* 鎵撳嵃recv鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ - rt_kprintf("\nReceived warning,recv function return 0.\r\n"); - } + } + else if (bytes_received == 0) + { + /* 鎵撳嵃recv鍑芥暟杩斿洖鍊间负0鐨勮鍛婁俊鎭� */ + rt_kprintf("\nReceived warning,recv function return 0.\r\n"); + continue; + } /* 鏈夋帴鏀跺埌鏁版嵁锛屾妸鏈娓呴浂 */ recv_data[bytes_received] = '\0'; -- cgit v1.3.1