diff options
Diffstat (limited to 'libpcsxcore/socket.c')
| -rw-r--r-- | libpcsxcore/socket.c | 165 |
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 } |
