Previous 199869 Revisions Next

r20789 Thursday 7th February, 2013 at 04:08:46 UTC by R. Belmont
Add server socket support instead of just client. [SailorSat, R. Belmont]
[src/osd/sdl]sdlfile.h sdlsocket.c
[src/osd/windows]winsocket.c

trunk/src/osd/sdl/sdlfile.h
r20788r20789
2929struct osd_file
3030{
3131   int handle;
32   int socket;
3233   int type;
3334   char    filename[1];
3435};
trunk/src/osd/sdl/sdlsocket.c
r20788r20789
22//
33//  sdlsocket.c - SDL socket (inet) access functions
44//
5//  Copyright (c) 1996-2010, Nicola Salmoria and the MAME Team.
5//  Copyright (c) 1996-2013, Nicola Salmoria and the MAME Team.
66//  Visit http://mamedev.org for licensing and usage restrictions.
77//
88//  SDLMAME by Olivier Galibert and R. Belmont
r20788r20789
5555
5656   sscanf( path+strlen(sdlfile_socket_identifier), "%255[^:]:%d", hostname, &port );
5757
58   printf("Connecting to server '%s' on port '%d'\n", hostname, port);
58//   printf("Connecting to server '%s' on port '%d'\n", hostname, port);
5959
60   if (((*file)->handle = socket(AF_INET, SOCK_STREAM, 0)) == -1)
60   if (((*file)->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
6161   {
6262      return FILERR_ACCESS_DENIED;
6363   }
6464
65   if (setsockopt((*file)->handle, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag)) == -1)
65   if (setsockopt((*file)->socket, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag)) == -1)
6666   {
6767      return FILERR_ACCESS_DENIED;
6868   }
r20788r20789
7474   sai.sin_port = htons(port);
7575   sai.sin_addr = *((struct in_addr *)localhost->h_addr);
7676
77   if (connect((*file)->handle, (struct sockaddr *)&sai, sizeof(struct sockaddr)) == -1)
77   // listening socket support
78   if (openflags & OPEN_FLAG_CREATE)
7879   {
80//      printf("Listening for client at '%s' on port '%d'\n", hostname, port);
81      // bind socket...
82      if (bind((*file)->socket, (struct sockaddr *)&sai, sizeof(struct sockaddr)) == -1)
83      {
84         return FILERR_ACCESS_DENIED;
85      }
86     
87      // start to listen...
88      if (listen((*file)->socket, 1) == -1) {
89         return FILERR_ACCESS_DENIED;
90      }
91     
92      // mark socket as "listening"
93      (*file)->handle = 0;
94      *filesize = 0;
95      return FILERR_NONE;
96   }
97
98//   printf("Connecting to server '%s' on port '%d'\n", hostname, port);
99   if (connect((*file)->socket, (struct sockaddr *)&sai, sizeof(struct sockaddr)) == -1)
100   {
79101      return FILERR_ACCESS_DENIED;
80102   }
81103
82104   *filesize = 0;
105   (*file)->handle = -1;
83106#endif
84107   return FILERR_NONE;
85108}
r20788r20789
93116   fd_set readfds;
94117
95118   FD_ZERO(&readfds);
96   FD_SET(file->handle, &readfds);
119   FD_SET(file->socket, &readfds);
97120   timeout.tv_sec = timeout.tv_usec = 0;
98121
99   if (select(file->handle + 1, &readfds, NULL, NULL, &timeout) < 0)
122   if (select(file->socket + 1, &readfds, NULL, NULL, &timeout) < 0)
100123   {
101124      sprintf(line, "%s : %s : %d ", __func__, __FILE__,  __LINE__);
102125      perror(line);
103126      return error_to_file_error(errno);
104127   }
105   else if (FD_ISSET(file->handle, &readfds))
128   else if (FD_ISSET(file->socket, &readfds))
106129   {
107      result = read(file->handle, buffer, count);
130      if (file->handle == -1)
131      {
132         // connected socket
133         result = read(file->socket, buffer, count);
134      }
135      else
136      {
137         // listening socket
138         int AcceptSocket;
139         AcceptSocket = accept(file->socket, NULL, NULL);
140         if (AcceptSocket < 0)
141         {
142            return FILERR_FAILURE;
143         }
144         close(file->socket);
145         file->socket = AcceptSocket;
146         file->handle = -1;
147         if (actual != NULL )
148         {
149            *actual = 0;
150         }
151
152         return FILERR_NONE;
153      }
108154   }
109155   else
110156   {
r20788r20789
129175#ifndef SDLMAME_WIN32
130176   ssize_t result;
131177
132   result = write(file->handle, buffer, count);
178   result = write(file->socket, buffer, count);
133179
134180   if (result < 0)
135181   {
r20788r20789
147193file_error sdl_close_socket(osd_file *file)
148194{
149195#ifndef SDLMAME_WIN32
150   close(file->handle);
196   close(file->socket);
151197   osd_free(file);
152198#endif
153199   return FILERR_NONE;
trunk/src/osd/windows/winsocket.c
r20788r20789
4343
4444   /* check for correct version */
4545   if ( LOBYTE( wsaData.wVersion ) != 2 ||
46         HIBYTE( wsaData.wVersion ) != 0 )
46      HIBYTE( wsaData.wVersion ) != 0 )
4747   {
4848      /* incorrect WinSock version */
4949      WSACleanup();
r20788r20789
6060
6161bool win_check_socket_path(const char *path)
6262{
63   if (*winfile_socket_identifier != 0 &&
63   if (strlen(winfile_socket_identifier) > 0 &&
6464      strncmp(path, winfile_socket_identifier, strlen(winfile_socket_identifier)) == 0 &&
6565      strchr(path, ':') != NULL) return true;
6666   return false;
r20788r20789
7676
7777   sscanf( path+strlen(winfile_socket_identifier), "%255[^:]:%d", hostname, &port );
7878
79   printf("Connecting to server '%s' on port '%d'\n", hostname, port);
80
8179   if (((*file)->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
8280   {
8381      return FILERR_ACCESS_DENIED;
r20788r20789
9492   sai.sin_port = htons(port);
9593   sai.sin_addr = *((struct in_addr *)localhost->h_addr);
9694
95   // listening socket support
96   if (openflags & OPEN_FLAG_CREATE)
97   {
98//      printf("Listening for client at '%s' on port '%d'\n", hostname, port);
99      // bind socket...
100      if (bind((*file)->socket, (struct sockaddr *)&sai, sizeof(struct sockaddr)) == -1)
101      {
102         return FILERR_ACCESS_DENIED;
103      }
104     
105      // start to listen...
106      if (listen((*file)->socket, 1) == -1) {
107         return FILERR_ACCESS_DENIED;
108      }
109     
110      // mark socket as "listening"
111      (*file)->handle = 0;
112      *filesize = 0;
113      return FILERR_NONE;
114   }
115   
116//   printf("Connecting to server '%s' on port '%d'\n", hostname, port);
97117   if (connect((*file)->socket, (struct sockaddr *)&sai, sizeof(struct sockaddr)) == -1)
98118   {
99119      return FILERR_ACCESS_DENIED;
100120   }
101121   *filesize = 0;
122   (*file)->handle = INVALID_HANDLE_VALUE;
102123   return FILERR_NONE;
103
104124}
105125
106126file_error win_read_socket(osd_file *file, void *buffer, UINT64 offset, UINT32 count, UINT32 *actual)
r20788r20789
122142   }
123143   else if (FD_ISSET(file->socket, &readfds))
124144   {
125      result = recv(file->socket, (char*)buffer, count, 0);
145      if (file->handle == INVALID_HANDLE_VALUE)
146      {
147         // connected socket
148         result = recv(file->socket, (char*)buffer, count, 0);
149      }
150      else
151      {
152         // listening socket
153         SOCKET AcceptSocket;
154         AcceptSocket = accept(file->socket, NULL, NULL);
155         if (AcceptSocket == INVALID_SOCKET)
156         {
157            return FILERR_FAILURE;
158         }
159         closesocket(file->socket);
160         file->socket = AcceptSocket;
161         file->handle = INVALID_HANDLE_VALUE;
162         if (actual != NULL )
163         {
164            *actual = 0;
165         }
166
167         return FILERR_NONE;
168      }
126169   }
127170   else
128171   {

Previous 199869 Revisions Next


© 1997-2024 The MAME Team