summaryrefslogtreecommitdiff
path: root/libpcsxcore/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpcsxcore/socket.c')
-rw-r--r--libpcsxcore/socket.c165
1 files changed, 97 insertions, 68 deletions
diff --git a/libpcsxcore/socket.c b/libpcsxcore/socket.c
index f0b19853..eec4c96a 100644
--- a/libpcsxcore/socket.c
+++ b/libpcsxcore/socket.c
@@ -21,6 +21,7 @@
#include "psxcommon.h"
#include "socket.h"
+#include "config.h"
#ifndef _WIN32
#include <sys/socket.h>
@@ -31,17 +32,10 @@
#include <fcntl.h>
#endif
-static int server_socket = 0;
-static int client_socket = 0;
-
-static char tbuf[513];
-static int ptr = 0;
-
-#define PORT_NUMBER 12345
-
-int StartServer() {
+int StartServer(unsigned short port) {
struct in_addr localhostaddr;
struct sockaddr_in localsocketaddr;
+ int ret;
#ifdef _WIN32
WSADATA wsaData;
@@ -50,17 +44,17 @@ int StartServer() {
return -1;
#endif
- server_socket = socket(AF_INET, SOCK_STREAM, 0);
+ ret = socket(AF_INET, SOCK_STREAM, 0);
#ifdef _WIN32
- if (server_socket == INVALID_SOCKET)
+ if (ret == INVALID_SOCKET)
return -1;
#else
- if (server_socket == -1)
- return -1;
+ if (ret == -1)
+ return ret;
#endif
- SetsNonblock();
+ SetsNonblock(ret);
memset((void *)&localhostaddr, 0, sizeof(localhostaddr));
memset(&localsocketaddr, 0, sizeof(struct sockaddr_in));
@@ -72,59 +66,51 @@ int StartServer() {
#endif
localsocketaddr.sin_family = AF_INET;
localsocketaddr.sin_addr = localhostaddr;
- localsocketaddr.sin_port = htons(PORT_NUMBER);
+ localsocketaddr.sin_port = htons(port);
- if (bind(server_socket, (struct sockaddr *) &localsocketaddr, sizeof(localsocketaddr)) < 0)
+ if (bind(ret, (struct sockaddr *) &localsocketaddr, sizeof(localsocketaddr)) < 0)
return -1;
- if (listen(server_socket, 1) != 0)
+ if (listen(ret, 1) != 0)
return -1;
- return 0;
+ return ret;
}
-void StopServer() {
+void StopServer(int s_socket) {
#ifdef _WIN32
- shutdown(server_socket, SD_BOTH);
- closesocket(server_socket);
+ shutdown(s_socket, SD_BOTH);
+ closesocket(s_socket);
WSACleanup();
#else
- shutdown(server_socket, SHUT_RDWR);
- close(server_socket);
+ shutdown(s_socket, SHUT_RDWR);
+ close(s_socket);
#endif
}
-void GetClient() {
- int new_socket;
- char hello[256];
+int GetClient(int s_socket, int blocking) {
+ int new_socket = accept(s_socket, NULL, NULL);
- new_socket = accept(server_socket, 0, 0);
-
#ifdef _WIN32
if (new_socket == INVALID_SOCKET)
- return;
+ return -1;
#else
if (new_socket == -1)
- return;
+ return -1;
#endif
- if (client_socket)
- CloseClient();
- client_socket = new_socket;
#ifndef _WIN32
+ if (!blocking)
{
int flags;
- flags = fcntl(client_socket, F_GETFL, 0);
- fcntl(client_socket, F_SETFL, flags | O_NONBLOCK);
+ flags = fcntl(new_socket, F_GETFL, 0);
+ fcntl(new_socket, F_SETFL, flags | O_NONBLOCK);
+ return new_socket;
}
#endif
-
- sprintf(hello, "000 PCSXR Version %s - Debug console\r\n", PACKAGE_VERSION);
- WriteSocket(hello, strlen(hello));
- ptr = 0;
}
-void CloseClient() {
+void CloseClient(int client_socket) {
if (client_socket) {
#ifdef _WIN32
shutdown(client_socket, SD_BOTH);
@@ -133,28 +119,69 @@ void CloseClient() {
shutdown(client_socket, SHUT_RDWR);
close(client_socket);
#endif
- client_socket = 0;
}
}
-int HasClient() {
- return client_socket ? 1 : 0;
+int HasClient(int client_socket) {
+ return client_socket > 0;
}
-int ReadSocket(char * buffer, int len) {
- int r;
- char * endl;
+#ifdef _WIN32
- if (!client_socket)
- return -1;
+static enum read_socket_err ReadSocketOS(SOCKET client_socket, char *buf, size_t *const len)
+{
+ const int res = recv(client_socket, buf, len, 0);
- r = recv(client_socket, tbuf + ptr, 512 - ptr, 0);
+ switch (res)
+ {
+ case SOCKET_ERROR:
+ return READ_SOCKET_ERR_RECV;
- if (r == 0) {
- client_socket = 0;
- if (!ptr)
- return 0;
+ case 0:
+ return READ_SOCKET_SHUTDOWN;
+
+ default:
+ *len = res;
+
+ break;
+ }
+
+ return READ_SOCKET_OK;
+}
+
+#elif defined(_POSIX_VERSION)
+
+static enum read_socket_err ReadSocketOS(int client_socket, char *buf, size_t *const len)
+{
+ const ssize_t res = recv(client_socket, buf, *len, 0);
+
+ switch (res)
+ {
+ case -1:
+ return READ_SOCKET_ERR_RECV;
+
+ case 0:
+ return READ_SOCKET_SHUTDOWN;
+
+ default:
+ *len = res;
+ break;
}
+
+ return READ_SOCKET_OK;
+}
+
+#endif /* _WIN32 */
+
+enum read_socket_err ReadSocket(int client_socket, char *buf, size_t *const len) {
+ char * endl;
+
+ if (!client_socket || !buf || !len || !*len)
+ return READ_SOCKET_ERR_INVALID_ARG;
+
+ return ReadSocketOS(client_socket, buf, len);
+
+#if 0
#ifdef _WIN32
if (r == SOCKET_ERROR)
#else
@@ -185,11 +212,11 @@ int ReadSocket(char * buffer, int len) {
}
buffer[r] = 0;
-
- return r;
+#endif
}
-int RawReadSocket(char * buffer, int len) {
+int RawReadSocket(int client_socket, char *buffer, size_t len) {
+#if 0
int r = 0;
int mlen = len < ptr ? len : ptr;
@@ -206,7 +233,6 @@ int RawReadSocket(char * buffer, int len) {
r = recv(client_socket, buffer + mlen, len - mlen, 0);
if (r == 0) {
- client_socket = 0;
if (!ptr)
return 0;
}
@@ -224,31 +250,34 @@ int RawReadSocket(char * buffer, int len) {
r += mlen;
return r;
+#endif
}
-void WriteSocket(char * buffer, int len) {
- if (!client_socket)
+void WriteSocket(int client_socket, const void *buffer, size_t len) {
+ if (client_socket <= 0)
return;
- send(client_socket, buffer, len, 0);
+ if (send(client_socket, buffer, len, 0) == -1) {
+ perror("send():");
+ }
}
-void SetsBlock() {
+void SetsBlock(int s_socket) {
#ifdef _WIN32
u_long b = 0;
- ioctlsocket(server_socket, FIONBIO, &b);
+ ioctlsocket(s_socket, FIONBIO, &b);
#else
- int flags = fcntl(server_socket, F_GETFL, 0);
- fcntl(server_socket, F_SETFL, flags & ~O_NONBLOCK);
+ int flags = fcntl(s_socket, F_GETFL, 0);
+ fcntl(s_socket, F_SETFL, flags & ~O_NONBLOCK);
#endif
}
-void SetsNonblock() {
+void SetsNonblock(int s_socket) {
#ifdef _WIN32
u_long b = 1;
- ioctlsocket(server_socket, FIONBIO, &b);
+ ioctlsocket(s_socket, FIONBIO, &b);
#else
- int flags = fcntl(server_socket, F_GETFL, 0);
- fcntl(server_socket, F_SETFL, flags | O_NONBLOCK);
+ int flags = fcntl(s_socket, F_GETFL, 0);
+ fcntl(s_socket, F_SETFL, flags | O_NONBLOCK);
#endif
}