how to save item in memory

Jun 5, 2013 at 10:48am
i created a server using a tcp connection. I also have a client program that connects to this server. I want the server to store the ip addresses of the clients that connect to it in memory. another program is then going to access this list
here is the server code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
int main(int argc, char **argv)
{
            WSADATA wsaData; 
            SOCKET ListeningSocket, NewConnection; 
            SOCKADDR_IN ServerAddr, SenderInfo; 
            int Port = 7171;
            char recvbuff[1024];
            int ByteReceived, i, nlen, SelectTiming;
           
            if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
            {
                 printf("Server: WSAStartup failed with error %ld.\n", WSAGetLastError());
                 return 1;
            }
            else
            {
				printf("Server: The Winsock DLL found!\n");
                printf("Server: The current status is %s.\n\n", wsaData.szSystemStatus);
            }
           
            if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2 )
            {
                 printf("Server: The dll do not support the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion));
                 WSACleanup();
                 return 1;
            }
            else
            {
                 printf("Server: The dll supports the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion))
            }
           
            ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (ListeningSocket == INVALID_SOCKET)
            {
				printf("Server: Error at socket, error code: %ld.\n", WSAGetLastError());
				WSACleanup();
				return 1;
            }
            else
			{
				printf("Server: socket is ok!\n");
			}

            ServerAddr.sin_family = AF_INET; 
            ServerAddr.sin_port = htons(Port);
            ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);

            if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)
            {
				printf("Server: bind failed! Error code: %ld.\n", WSAGetLastError());
				closesocket(ListeningSocket);
				WSACleanup();
				return 1;
            }
            else
			{
				printf("Server: bind is working\n");
			}
 
            if (listen(ListeningSocket, 5) == SOCKET_ERROR)
            {
				printf("Server: listen: Error listening on socket %ld.\n", WSAGetLastError());
				closesocket(ListeningSocket);
				WSACleanup();
				return 1;
            }
            else
			{
				printf("Server: listening for connections...\n\n");
			}
					while(1)
					{
						NewConnection = SOCKET_ERROR;
						while(NewConnection == SOCKET_ERROR)
						{
							NewConnection = accept(ListeningSocket, NULL, NULL);
							printf("Server: accept is working...\n");
							printf("Server: New client got connected, ready to receive and send data...\n\n");
							ByteReceived = recv(NewConnection, recvbuff, sizeof(recvbuff), 0);

							if ( ByteReceived > 0 )
							{
								printf("Server: recv is working....\n");
								getsockname(ListeningSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
								printf("Server: IP(s) used by Server: %s\n", inet_ntoa(ServerAddr.sin_addr)); 
								printf("Server: port used by Server: %d\n\n", htons(ServerAddr.sin_port));

								memset(&SenderInfo, 0, sizeof(SenderInfo));
								nlen = sizeof(SenderInfo);

								getpeername(NewConnection, (SOCKADDR *)&SenderInfo, &nlen);
								printf("Server: IP used by Client: %s\n", inet_ntoa(SenderInfo.sin_addr));
								printf("Server: Port used by Client: %d\n", htons(SenderInfo.sin_port));
								printf("Server: Bytes received: %d\n", ByteReceived);
								printf("Server: Those bytes are: \"");
								for(i=0;i < ByteReceived;i++)
								{
									printf("%c", recvbuff[i]);
								}
								printf("\"");
							}
							else if ( ByteReceived == 0 )
							{
								printf("Server: Connection closed!\n");
							}
							else
							{
								printf("Server: recv failed with error code: %d\n", WSAGetLastError());
							}
						}
						if( shutdown(NewConnection, SD_SEND) != 0)
							printf("\n\nServer: Well, there is something wrong with the shutdown. The error code: %ld\n", WSAGetLastError());
						else
							printf("\nServer: shutdown is working...\n");

					}
 
            return 0;
}
Jun 5, 2013 at 2:30pm
the easiest way would to store the data to a certain file.


but you may want to use memory mapped files:

http://msdn.microsoft.com/en-us/library/ms810613.aspx
Jun 5, 2013 at 2:51pm
I would write the file to a /tmp file, that way if the server reboots, or program crashes you still have the information if needed that way.

If you don't mind sharing your client code, I would love to play with it.
Last edited on Jun 5, 2013 at 2:52pm
Topic archived. No new replies allowed.