#include "cf_socket.h" #include "cf_debug.h" #include "cf_log.h" #include "cf_thread.h" #include #include #include #define LOG_SOCKET 0 #define THREAD_POOL 1 #define PORT 1234 int socket_echo_server (void * arg) { int srvsock = *((int *)arg); int clntsock = 0; int recvd = 0; char buf[1024] = {0x00,}; int i = 0; /*------------------------------------------------------------*/ clntsock = CF_Socket_Accept (srvsock); if (clntsock < 0) { CF_DEBUG_PRINT (stderr, "failed to accept on server\n"); return -1; } CF_Log_Write (LOG_SOCKET, "SERVER", "accepted\n"); for (i = 0 ; i < 5 ; i++) { if ((recvd = CF_Socket_Recv (clntsock, buf, sizeof (buf))) < 0) { CF_DEBUG_PRINT (stderr, "failed to recv on server\n"); return -2; } CF_Log_Write (LOG_SOCKET, "SERVER", "recv {%s}\n", buf); CF_DEBUG_PRINT (stderr, "[SERVER] recv {%s}\n", buf); if (CF_Socket_Send (clntsock, buf, (size_t)recvd) < 0) { return -3; } CF_Log_Write (LOG_SOCKET, "SERVER", "resp {%s}\n", buf); CF_DEBUG_PRINT (stderr, "[SERVER] resp {%s}\n", buf); } CF_Socket_Close (clntsock); return 0; /*------------------------------------------------------------*/ } int socket_echo_client (void * arg) { int sock = 0; int recvd = 0; char buf[1024] = {0x00,}; int i = 0; sprintf (buf, "...wow ? is it succeed ?"); /*------------------------------------------------------------*/ sock = CF_Socket_Connect ("localhost", PORT); if (sock < 0) { CF_DEBUG_PRINT (stderr, "failed to connect on client\n"); return -1; } CF_Log_Write (LOG_SOCKET, "CLIENT", "connected\n"); for (i = 0 ; i < 5 ; i++) { if (CF_Socket_Send (sock, buf, sizeof (buf)) < 0) { CF_DEBUG_PRINT (stderr, "failed to send on client %d\n", errno); return -2; } CF_Log_Write (LOG_SOCKET, "CLIENT", "sent {%s}\n", buf); CF_DEBUG_PRINT (stderr, "[CLIENT] sent {%s}\n", buf); memset (buf, 0x00, sizeof (buf)); if ((recvd = CF_Socket_Recv (sock, buf, sizeof (buf))) < 0) { CF_DEBUG_PRINT (stderr, "failed to recv on client\n"); return -3; } CF_Log_Write (LOG_SOCKET, "CLIENT", "recv {%s}\n", buf); CF_DEBUG_PRINT (stderr, "[CLIENT] recv {%s}\n", buf); } CF_Socket_Close (sock); return 0; /*------------------------------------------------------------*/ } int main () { CF_Thread_Ctx stid[THREAD_POOL]; CF_Thread_Ctx ctid[THREAD_POOL]; int sock = 0; int iter = 0; /*------------------------------------------------------------*/ if (CF_Log_Initialize (1) < 0) { fprintf (stderr, "failed to init. log\n"); return -1; } if (CF_Log_Open (LOG_SOCKET, "socket.txt", CF_LOG_DEFAULT_BUFFER) < 0) CF_DEBUG_PRINT (stderr, "failed to open log\n"); CF_Log_Write (LOG_SOCKET, "LOG_MULTITHREAD", "multi-threaded logging test with socket\n"); if (CF_Socket_Initialize () < 0) { CF_DEBUG_PRINT (stderr, "failed to initialize socket\n"); return -2; } CF_Log_Write (LOG_SOCKET, "SOCKET", "socket initialized\n"); sock = CF_Socket_Server (PORT, 5); if (sock < 0) { CF_DEBUG_PRINT (stderr, "failed to ready server %d\n", sock); return -3; } CF_Log_Write (LOG_SOCKET, "SOCKET", "socket ready\n"); for (iter = 0 ; iter < THREAD_POOL ; iter++) { if (CF_Thread_CreateCtx (&stid[iter], socket_echo_server, &sock) < 0) { CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter); return -4; } CF_Log_Write (LOG_SOCKET, "SOCKET", "create server thread-%d\n", iter); } for (iter = 0 ; iter < THREAD_POOL ; iter++) { if (CF_Thread_CreateCtx (&ctid[iter], socket_echo_client, &sock) < 0) { CF_DEBUG_PRINT (stderr, "failed to create %dth thread\n", iter); return -5; } CF_Log_Write (LOG_SOCKET, "SOCKET", "create client thread-%d\n", iter); } for (iter = 0 ; iter < THREAD_POOL ; iter++) { if (CF_Thread_Start (stid[iter]) < 0) { CF_DEBUG_PRINT (stderr, "failed to start %dth thread\n", iter); return -6; } } for (iter = 0 ; iter < THREAD_POOL ; iter++) { if (CF_Thread_Start (ctid[iter]) < 0) { CF_DEBUG_PRINT (stderr, "failed to start %dth thread\n", iter); return -7; } } for (iter = 0 ; iter < THREAD_POOL ; iter++) { CF_Thread_Join (ctid[iter]); CF_Thread_DestroyCtx (ctid[iter]); CF_Thread_Join (stid[iter]); CF_Thread_DestroyCtx (stid[iter]); CF_Log_Write (LOG_SOCKET, "SOCKET", "join server thread-%d\n", iter); } CF_Socket_Close (sock); CF_Socket_Finalize (); CF_Log_Close (LOG_SOCKET); CF_Log_Finalize (); /*------------------------------------------------------------*/ return 0; }