1
1
/*
2
- * Copyright (c) 2006-2021 , RT-Thread Development Team
2
+ * Copyright (c) 2006-2022 , RT-Thread Development Team
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*
6
6
* Change Logs:
7
7
* Date Author Notes
8
+ * 2022-01-24 ChungHsuan improve code comments
8
9
*/
9
10
10
11
#include <rtthread.h>
16
17
#include <sys/time.h>
17
18
#include <sys/select.h>
18
19
#endif
19
- #include <sys/socket.h> /* 使用BSD socket,需要包含socket.h头文件 */
20
+ #include <sys/socket.h> /* socket.h header file is needed when using BSD socket */ /* 使用BSD socket,需要包含socket.h头文件 */
20
21
#include "netdb.h"
21
22
22
23
#define DEBUG_TCP_SERVER
34
35
static int started = 0 ;
35
36
static int is_running = 0 ;
36
37
static int port = 5000 ;
37
- static const char send_data [] = "This is TCP Server from RT-Thread." ; /* 发送用到的数据 */
38
+ static const char send_data [] = "This is TCP Server from RT-Thread." ; /* The message be sent */ /* 发送用到的数据 */
38
39
40
+ /**
41
+ * @brief This function is for creating a tcp server on RT-Thread
42
+ */
39
43
static void tcpserv (void * arg )
40
44
{
41
45
int ret ;
42
- char * recv_data ; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */
46
+ char * recv_data ; /* recv_data is a pointer used to receive data */ /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */
43
47
int sock , connected , bytes_received ;
44
48
struct sockaddr_in server_addr , client_addr ;
45
49
46
50
struct timeval timeout ;
47
51
fd_set readset , readset_c ;
48
52
socklen_t sin_size = sizeof (struct sockaddr_in );
49
53
50
- recv_data = rt_malloc (BUFSZ + 1 ); /* 分配接收用的数据缓冲 */
54
+ recv_data = rt_malloc (BUFSZ + 1 );/* Allocate space for recv_data */ /* 分配接收用的数据缓冲 */
51
55
if (recv_data == RT_NULL )
52
56
{
53
57
LOG_E ("No memory" );
54
58
return ;
55
59
}
56
-
60
+ /* Before making use of socket, socket should be created first and set the socket created to SOCK_STREAM(TCP) */
57
61
/* 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket */
58
62
if ((sock = socket (AF_INET , SOCK_STREAM , IPPROTO_TCP )) == -1 )
59
63
{
60
64
LOG_E ("Create socket error" );
61
65
goto __exit ;
62
66
}
63
-
67
+ /* Initialize server side address */
64
68
/* 初始化服务端地址 */
65
69
server_addr .sin_family = AF_INET ;
66
- server_addr .sin_port = htons (port ); /* 服务端工作的端口 */
70
+ server_addr .sin_port = htons (port ); /*Server side port number*/ /* 服务端工作的端口 */
67
71
server_addr .sin_addr .s_addr = INADDR_ANY ;
68
72
rt_memset (& (server_addr .sin_zero ), 0x0 , sizeof (server_addr .sin_zero ));
69
-
73
+ /* Bind socket to server side address */
70
74
/* 绑定socket到服务端地址 */
71
75
if (bind (sock , (struct sockaddr * )& server_addr , sizeof (struct sockaddr )) == -1 )
72
76
{
73
77
LOG_E ("Unable to bind" );
74
78
goto __exit ;
75
79
}
76
-
80
+ /* Listen on socket */
77
81
/* 在socket上进行监听 */
78
82
if (listen (sock , 10 ) == -1 )
79
83
{
@@ -99,20 +103,21 @@ static void tcpserv(void *arg)
99
103
/* Wait for read or write */
100
104
if (select (sock + 1 , & readset , RT_NULL , RT_NULL , & timeout ) == 0 )
101
105
continue ;
102
-
106
+ /* Accept a request from client and the function is blocking */
103
107
/* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */
104
108
connected = accept (sock , (struct sockaddr * )& client_addr , & sin_size );
109
+ /* Return the socket connected sucessfully */
105
110
/* 返回的是连接成功的socket */
106
111
if (connected < 0 )
107
112
{
108
113
LOG_E ("accept connection failed! errno = %d" , errno );
109
114
continue ;
110
115
}
111
-
116
+ /* Accept the message which points by client address */
112
117
/* 接受返回的client_addr指向了客户端的地址信息 */
113
118
LOG_I ("I got a connection from (%s , %d)\n" ,
114
119
inet_ntoa (client_addr .sin_addr ), ntohs (client_addr .sin_port ));
115
-
120
+ /* Handle method of client connection */
116
121
/* 客户端连接的处理 */
117
122
while (is_running )
118
123
{
@@ -122,7 +127,7 @@ static void tcpserv(void *arg)
122
127
/* Wait for read or write */
123
128
if (select (connected + 1 , & readset_c , RT_NULL , RT_NULL , & timeout ) == 0 )
124
129
continue ;
125
-
130
+ /* Receive message from connected socket. Buffer size is 1024 bytes,but it's not guranteed to receive size exactly 1024 */
126
131
/* 从connected socket中接收数据,接收buffer是1024大小,但并不一定能够收到1024大小的数据 */
127
132
bytes_received = recv (connected , recv_data , BUFSZ , 0 );
128
133
if (bytes_received < 0 )
@@ -134,16 +139,18 @@ static void tcpserv(void *arg)
134
139
}
135
140
else if (bytes_received == 0 )
136
141
{
142
+ /* Print warning message when recv function return 0 */
137
143
/* 打印recv函数返回值为0的警告信息 */
138
144
LOG_W ("Received warning, recv function return 0." );
139
145
continue ;
140
146
}
141
147
else
142
- {
148
+ { /* Receive data sucessfully and append '\0' at the end of message */
143
149
/* 有接收到数据,把末端清零 */
144
150
recv_data [bytes_received ] = '\0' ;
145
151
if (strcmp (recv_data , "q" ) == 0 || strcmp (recv_data , "Q" ) == 0 )
146
152
{
153
+ /* If the first letter is 'q' or 'Q', close the connection */
147
154
/* 如果是首字母是q或Q,关闭这个连接 */
148
155
LOG_I ("Got a 'q' or 'Q', close the connect." );
149
156
closesocket (connected );
@@ -152,18 +159,20 @@ static void tcpserv(void *arg)
152
159
}
153
160
else if (strcmp (recv_data , "exit" ) == 0 )
154
161
{
162
+ /* If the message received is 'exit', close the whole server side. */
155
163
/* 如果接收的是exit,则关闭整个服务端 */
156
164
closesocket (connected );
157
165
connected = -1 ;
158
166
goto __exit ;
159
167
}
160
168
else
161
169
{
170
+ /* Show the message in terminal */
162
171
/* 在控制终端显示收到的数据 */
163
172
LOG_D ("Received data = %s" , recv_data );
164
173
}
165
174
}
166
-
175
+ /* Send message to connected socket */
167
176
/* 发送数据到connected socket */
168
177
ret = send (connected , send_data , rt_strlen (send_data ), 0 );
169
178
if (ret < 0 )
@@ -175,6 +184,7 @@ static void tcpserv(void *arg)
175
184
}
176
185
else if (ret == 0 )
177
186
{
187
+ /* Print warning message when send function return 0 */
178
188
/* 打印send函数返回值为0的警告信息 */
179
189
LOG_W ("Send warning, send function return 0." );
180
190
}
@@ -202,6 +212,9 @@ static void tcpserv(void *arg)
202
212
return ;
203
213
}
204
214
215
+ /**
216
+ * @brief The usage description of tcp server on rt-Thread
217
+ */
205
218
static void usage (void )
206
219
{
207
220
rt_kprintf ("Usage: tcpserver -p <port>\n" );
@@ -214,6 +227,9 @@ static void usage(void)
214
227
rt_kprintf (" --help Print help information\n" );
215
228
}
216
229
230
+ /**
231
+ * @brief This function is for testing tcp server on rt-Thread
232
+ */
217
233
static void tcpserver_test (int argc , char * * argv )
218
234
{
219
235
rt_thread_t tid ;
0 commit comments