1+ #include <stdio.h>
2+ #include <unistd.h>
3+ #include <errno.h>
4+ #include <string.h>
5+ #include <sys/socket.h>
6+ #include <netinet/in.h>
7+ #include <fcntl.h>
8+ #include "test.h"
9+
10+ #define TEST (c , ...) ((c) ? 1 : (t_error(#c " failed: " __VA_ARGS__), 0))
11+ #define TESTE (c ) (errno = 0, TEST(c, "errno = %s\n", strerror(errno)))
12+
13+ int main (void ) {
14+ struct sockaddr_in sa = { .sin_family = AF_INET };
15+ int server_fd , client_fd ;
16+ char buffer [100 ];
17+
18+ // 创建 TCP Socket
19+ TESTE ((server_fd = socket (PF_INET , SOCK_STREAM , IPPROTO_TCP )) >= 0 );
20+
21+ // 绑定地址和端口
22+ sa .sin_port = htons (8080 ); // 使用端口 8080
23+ sa .sin_addr .s_addr = htonl (INADDR_LOOPBACK ); // 绑定到本地回环地址
24+ TESTE (bind (server_fd , (struct sockaddr * )& sa , sizeof (sa )) == 0 );
25+
26+ // 监听连接
27+ TESTE (listen (server_fd , 1 ) == 0 );
28+
29+ // 获取绑定的地址和端口
30+ socklen_t addrlen = sizeof (sa );
31+ TESTE (getsockname (server_fd , (struct sockaddr * )& sa , & addrlen ) == 0 );
32+ printf ("Server listening on port %d\n" , ntohs (sa .sin_port ));
33+
34+ // 创建客户端 Socket
35+ TESTE ((client_fd = socket (PF_INET , SOCK_STREAM , IPPROTO_TCP )) >= 0 );
36+
37+ // 连接到服务器
38+ TESTE (connect (client_fd , (struct sockaddr * )& sa , sizeof (sa )) == 0 );
39+
40+ // 接受客户端连接
41+ int accepted_fd ;
42+ TESTE ((accepted_fd = accept (server_fd , (struct sockaddr * )& sa , & addrlen )) >= 0 );
43+
44+ // 客户端发送数据
45+ const char * message = "Hello, server!" ;
46+ TESTE (send (client_fd , message , strlen (message ), 0 ) == strlen (message ));
47+
48+ // 服务器接收数据
49+ ssize_t received = recv (accepted_fd , buffer , sizeof (buffer ), 0 );
50+ TESTE (received >= 0 );
51+ buffer [received ] = '\0' ; // 确保字符串以 null 结尾
52+ TEST (strcmp (buffer , message ) == 0 , "Received: '%s', Expected: '%s'\n" , buffer , message );
53+
54+ // 服务器发送响应
55+ const char * response = "Hello, client!" ;
56+ TESTE (send (accepted_fd , response , strlen (response ), 0 ) == strlen (response ));
57+
58+ // 客户端接收响应
59+ received = recv (client_fd , buffer , sizeof (buffer ), 0 );
60+ TESTE (received >= 0 );
61+ buffer [received ] = '\0' ; // 确保字符串以 null 结尾
62+ TEST (strcmp (buffer , response ) == 0 , "Received: '%s', Expected: '%s'\n" , buffer , response );
63+
64+ // 关闭 Socket
65+ close (accepted_fd );
66+ close (client_fd );
67+ close (server_fd );
68+
69+ return t_status ;
70+ }
0 commit comments