VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTTcp-1.cpp@ 32801

Last change on this file since 32801 was 32801, checked in by vboxsync, 15 years ago

rtTcpClose: The trunk fix for the graceful shutdown hang.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.5 KB
Line 
1#include <iprt/tcp.h>
2
3#include <iprt/string.h>
4#include <iprt/test.h>
5
6
7/*******************************************************************************
8* Global Variables *
9*******************************************************************************/
10static RTTEST g_hTest;
11
12
13static DECLCALLBACK(int) test2Server(RTSOCKET hSocket, void *pvUser)
14{
15 RTTestSetDefault(g_hTest, NULL);
16 char szBuf[512];
17
18 /* say hello */
19 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
20 RT_ZERO(szBuf);
21 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
22 szBuf[sizeof("dude!\n") - 1] = '\0';
23 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
24
25 /* wait for a goodbye which doesn't arrive. */
26 RT_ZERO(szBuf);
27 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VERR_NET_SHUTDOWN, VERR_TCP_SERVER_STOP);
28
29 return VERR_TCP_SERVER_STOP;
30}
31
32
33void test2()
34{
35 RTTestSub(g_hTest, "Rude client");
36
37 PRTTCPSERVER pServer;
38 RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
39 test2Server, NULL, &pServer), VINF_SUCCESS);
40
41 int rc;
42 RTSOCKET hSocket;
43 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
44 if (RT_SUCCESS(rc))
45 {
46 char szBuf[512];
47 RT_ZERO(szBuf);
48 do /* break non-loop */
49 {
50 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
51 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
52 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
53 } while (0);
54
55 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
56 }
57
58 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
59}
60
61
62static DECLCALLBACK(int) test1Server(RTSOCKET hSocket, void *pvUser)
63{
64 RTTestSetDefault(g_hTest, NULL);
65
66 char szBuf[512];
67 RTTESTI_CHECK_RET(pvUser == NULL, VERR_TCP_SERVER_STOP);
68
69 /* say hello */
70 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
71 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
72 szBuf[sizeof("dude!\n") - 1] = '\0';
73 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
74
75 /* say goodbye */
76 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
77 szBuf[sizeof("byebye\n") - 1] = '\0';
78 RTTESTI_CHECK_RET(strcmp(szBuf, "byebye\n") == 0, VERR_TCP_SERVER_STOP);
79 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "bye\n", sizeof("bye\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
80
81 return VERR_TCP_SERVER_STOP;
82}
83
84
85void test1()
86{
87 RTTestSub(g_hTest, "Simple server-client setup");
88
89 PRTTCPSERVER pServer;
90 RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-1",
91 test1Server, NULL, &pServer), VINF_SUCCESS);
92
93 int rc;
94 RTSOCKET hSocket;
95 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
96 if (RT_SUCCESS(rc))
97 {
98 do /* break non-loop */
99 {
100 char szBuf[512];
101 RT_ZERO(szBuf);
102 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
103 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
104 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
105
106 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "byebye\n", sizeof("byebye\n") - 1), VINF_SUCCESS);
107 RT_ZERO(szBuf);
108 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("bye\n") - 1, NULL), VINF_SUCCESS);
109 RTTESTI_CHECK_BREAK(strcmp(szBuf, "bye\n") == 0);
110 } while (0);
111
112 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
113 }
114
115 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
116}
117
118
119int main()
120{
121 RTEXITCODE rcExit = RTTestInitAndCreate("tstRTTcp-1", &g_hTest);
122 if (rcExit != RTEXITCODE_SUCCESS)
123 return rcExit;
124 RTTestBanner(g_hTest);
125
126 test1();
127 test2();
128
129 /** @todo test the full RTTcp API. */
130
131 return RTTestSummaryAndDestroy(g_hTest);
132}
133
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette