📄 socket.c
字号:
} } PR_Close(sockfd); PR_DELETE(in_buf); PR_DELETE(out_buf); /* * Decrement exit_counter and notify parent thread */ PR_EnterMonitor(cp->exit_mon); --(*cp->exit_counter); PR_Notify(cp->exit_mon); PR_ExitMonitor(cp->exit_mon); PR_DELETE(cp); DPRINTF(("UDP_Client [0x%x] exiting\n", PR_GetCurrentThread()));}/* * TCP_Socket_Client_Server_Test - concurrent server test * * One server and several clients are started * Each client connects to the server and sends a chunk of data * For each connection, server starts another thread to read the data * from the client and send it back to the client, unmodified. * Each client checks that data received from server is same as the * data it sent to the server. * */static PRInt32TCP_Socket_Client_Server_Test(void){ int i; PRThread *t; PRSemaphore *server_sem; Server_Param *sparamp; Client_Param *cparamp; PRMonitor *mon2; PRInt32 datalen; datalen = tcp_mesg_size; thread_count = 0; /* * start the server thread */ sparamp = PR_NEW(Server_Param); if (sparamp == NULL) { fprintf(stderr,"prsocket_test: PR_NEW failed\n"); failed_already=1; return -1; } server_sem = PR_NewSem(0); if (server_sem == NULL) { fprintf(stderr,"prsocket_test: PR_NewSem failed\n"); failed_already=1; return -1; } mon2 = PR_NewMonitor(); if (mon2 == NULL) { fprintf(stderr,"prsocket_test: PR_NewMonitor failed\n"); failed_already=1; return -1; } PR_EnterMonitor(mon2); sparamp->addr_sem = server_sem; sparamp->exit_mon = mon2; sparamp->exit_counter = &thread_count; sparamp->datalen = datalen; t = PR_CreateThread(PR_USER_THREAD, TCP_Server, (void *)sparamp, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0); if (t == NULL) { fprintf(stderr,"prsocket_test: PR_CreateThread failed\n"); failed_already=1; return -1; } DPRINTF(("Created TCP server = 0x%lx\n", t)); thread_count++; /* * wait till the server address is setup */ PR_WaitSem(server_sem); /* * Now start a bunch of client threads */ cparamp = PR_NEW(Client_Param); if (cparamp == NULL) { fprintf(stderr,"prsocket_test: PR_NEW failed\n"); failed_already=1; return -1; } cparamp->server_addr = tcp_server_addr; cparamp->exit_mon = mon2; cparamp->exit_counter = &thread_count; cparamp->datalen = datalen; for (i = 0; i < num_tcp_clients; i++) { t = create_new_thread(PR_USER_THREAD, TCP_Client, (void *) cparamp, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0, i); if (t == NULL) { fprintf(stderr,"prsocket_test: PR_CreateThread failed\n"); failed_already=1; return -1; } DPRINTF(("Created TCP client = 0x%lx\n", t)); thread_count++; } /* Wait for server and client threads to exit */ while (thread_count) { PR_Wait(mon2, PR_INTERVAL_NO_TIMEOUT); DPRINTF(("TCP Server - thread_count = %d\n", thread_count)); } PR_ExitMonitor(mon2); printf("%30s","TCP_Socket_Client_Server_Test:"); printf("%2ld Server %2ld Clients %2ld connections_per_client\n",1l, num_tcp_clients, num_tcp_connections_per_client); printf("%30s %2ld messages_per_connection %4ld bytes_per_message\n",":", num_tcp_mesgs_per_connection, tcp_mesg_size); return 0;}/* * UDP_Socket_Client_Server_Test - iterative server test * * One server and several clients are started * Each client connects to the server and sends a chunk of data * For each connection, server starts another thread to read the data * from the client and send it back to the client, unmodified. * Each client checks that data received from server is same as the * data it sent to the server. * */static PRInt32UDP_Socket_Client_Server_Test(void){ int i; PRThread *t; PRSemaphore *server_sem; Server_Param *sparamp; Client_Param *cparamp; PRMonitor *mon2; PRInt32 datalen; PRInt32 udp_connect = 1; datalen = udp_datagram_size; thread_count = 0; /* * start the server thread */ sparamp = PR_NEW(Server_Param); if (sparamp == NULL) { fprintf(stderr,"prsocket_test: PR_NEW failed\n"); failed_already=1; return -1; } server_sem = PR_NewSem(0); if (server_sem == NULL) { fprintf(stderr,"prsocket_test: PR_NewSem failed\n"); failed_already=1; return -1; } mon2 = PR_NewMonitor(); if (mon2 == NULL) { fprintf(stderr,"prsocket_test: PR_NewMonitor failed\n"); failed_already=1; return -1; } PR_EnterMonitor(mon2); sparamp->addr_sem = server_sem; sparamp->exit_mon = mon2; sparamp->exit_counter = &thread_count; sparamp->datalen = datalen; DPRINTF(("Creating UDP server")); t = PR_CreateThread(PR_USER_THREAD, UDP_Server, (void *)sparamp, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0); if (t == NULL) { fprintf(stderr,"prsocket_test: PR_CreateThread failed\n"); failed_already=1; return -1; } thread_count++; /* * wait till the server address is setup */ PR_WaitSem(server_sem); /* * Now start a bunch of client threads */ for (i = 0; i < num_udp_clients; i++) { cparamp = PR_NEW(Client_Param); if (cparamp == NULL) { fprintf(stderr,"prsocket_test: PR_NEW failed\n"); failed_already=1; return -1; } cparamp->server_addr = udp_server_addr; cparamp->exit_mon = mon2; cparamp->exit_counter = &thread_count; cparamp->datalen = datalen; /* * Cause every other client thread to connect udp sockets */#ifndef XP_MAC cparamp->udp_connect = udp_connect;#else /* No support for UDP connects on Mac */ cparamp->udp_connect = 0;#endif if (udp_connect) udp_connect = 0; else udp_connect = 1; DPRINTF(("Creating UDP client %d\n", i)); t = PR_CreateThread(PR_USER_THREAD, UDP_Client, (void *) cparamp, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_UNJOINABLE_THREAD, 0); if (t == NULL) { fprintf(stderr,"prsocket_test: PR_CreateThread failed\n"); failed_already=1; return -1; } thread_count++; } /* Wait for server and client threads to exit */ while (thread_count) { PR_Wait(mon2, PR_INTERVAL_NO_TIMEOUT); DPRINTF(("UDP Server - thread_count = %d\n", thread_count)); } PR_ExitMonitor(mon2); printf("%30s","UDP_Socket_Client_Server_Test: "); printf("%2ld Server %2ld Clients\n",1l, num_udp_clients); printf("%30s %2ld datagrams_per_client %4ld bytes_per_datagram\n",":", num_udp_datagrams_per_client, udp_datagram_size); return 0;}static PRFileDesc *small_file_fd, *large_file_fd;static void *small_file_addr, *small_file_header, *large_file_addr;static void *small_file_trailer, *large_file_header, *large_file_trailer;/* * TransmitFile_Client * Client Thread */static voidTransmitFile_Client(void *arg){ PRFileDesc *sockfd; union PRNetAddr netaddr; char *small_buf, *large_buf; Client_Param *cp = (Client_Param *) arg; PRInt32 rlen; small_buf = (char*)PR_Malloc(SMALL_FILE_SIZE + SMALL_FILE_HEADER_SIZE + SMALL_FILE_TRAILER_SIZE); if (small_buf == NULL) { fprintf(stderr,"prsocket_test: failed to alloc buffer\n"); failed_already=1; return; } large_buf = (char*)PR_Malloc(LARGE_FILE_SIZE + LARGE_FILE_HEADER_SIZE + LARGE_FILE_TRAILER_SIZE); if (large_buf == NULL) { fprintf(stderr,"prsocket_test: failed to alloc buffer\n"); failed_already=1; return; } netaddr.inet.family = cp->server_addr.inet.family; netaddr.inet.port = cp->server_addr.inet.port; netaddr.inet.ip = cp->server_addr.inet.ip; if ((sockfd = PR_NewTCPSocket()) == NULL) { fprintf(stderr,"prsocket_test: PR_NewTCPSocket failed\n"); failed_already=1; return; } if (PR_Connect(sockfd, &netaddr,PR_INTERVAL_NO_TIMEOUT) < 0){ fprintf(stderr,"prsocket_test: PR_Connect failed\n"); failed_already=1; return; } /* * read the small file and verify the data */ if (readn(sockfd, small_buf, SMALL_FILE_SIZE + SMALL_FILE_HEADER_SIZE) != (SMALL_FILE_SIZE + SMALL_FILE_HEADER_SIZE)) { fprintf(stderr, "prsocket_test: TransmitFile_Client failed to receive file\n"); failed_already=1; return; }#ifdef XP_UNIX if (memcmp(small_file_header, small_buf, SMALL_FILE_HEADER_SIZE) != 0){ fprintf(stderr, "prsocket_test: TransmitFile_Client ERROR - small file header data corruption\n"); failed_already=1; return; } if (memcmp(small_file_addr, small_buf + SMALL_FILE_HEADER_SIZE, SMALL_FILE_SIZE) != 0) { fprintf(stderr, "prsocket_test: TransmitFile_Client ERROR - small file data corruption\n"); failed_already=1; return; }#endif /* * read the large file and verify the data */ if (readn(sockfd, large_buf, LARGE_FILE_SIZE) != LARGE_FILE_SIZE) { fprintf(stderr, "prsocket_test: TransmitFile_Client failed to receive file\n"); failed_already=1; return; }#ifdef XP_UNIX if (memcmp(large_file_addr, large_buf, LARGE_FILE_SIZE) != 0) { fprintf(stderr, "prsocket_test: TransmitFile_Client ERROR - large file data corruption\n"); failed_already=1; }#endif /* * receive data from PR_SendFile */ /* * case 1: small file with header and trailer */ rlen = SMALL_FILE_SIZE + SMALL_FILE_HEADER_SIZE + SMALL_FILE_TRAILER_SIZE; if (readn(sockfd, small_buf, rlen) != rlen) { fprintf(stderr, "prsocket_test: SendFile_Client failed to receive file\n"); failed_already=1; return; }#ifdef XP_UNIX if (memcmp(small_file_header, small_buf, SMALL_FILE_HEADER_SIZE) != 0){ fprintf(stderr, "SendFile 1. ERROR - small file header corruption\n"); failed_already=1; return; } if (memcmp(small_file_addr, small_buf + SMALL_FILE_HEADER_SIZE, SMALL_FILE_SIZE) != 0) { fprintf(stderr, "SendFile 1. ERROR - small file data corruption\n"); failed_already=1; return; } if (memcmp(small_file_trailer, small_buf + SMALL_FILE_HEADER_SIZE + SMALL_FILE_SIZE, SMALL_FILE_TRAILER_SIZE) != 0) { fprintf(stderr, "SendFile 1. ERROR - small file trailer corruption\n"); failed_already=1; return; }#endif /* * case 2: partial large file at zero offset, file with header and trailer */ rlen = LARGE_FILE_LEN_1 + LARGE_FILE_HEADER_SIZE + LARGE_FILE_TRAILER_SIZE; if (readn(sockfd, large_buf, rlen) != rlen) { fprintf(stderr, "prsocket_test: SendFile_Client failed to receive file\n"); failed_already=1; return; }#ifdef XP_UNIX if (memcmp(large_file_header, large_buf, LARGE_FILE_HEADER_SIZE) != 0){ fprintf(stderr, "SendFile 2. ERROR - large file header corruption\n"); failed_already=1; return; } if (memcmp(large_file_addr, large_buf + LARGE_FILE_HEADER_SIZE, LARGE_FILE_LEN_1) != 0) { fprintf(stderr, "SendFile 2. ERROR - large file data corruption\n"); failed_already=1; return; } if (memcmp(large_file_trailer, large_buf + LARGE_FILE_HEADER_SIZE + LARGE_FILE_LEN_1, LARGE_FILE_TRAILER_SIZE) != 0) { fprintf(stderr, "SendFile 2. ERROR - large file trailer corruption\n"); failed_already=1; return; }#endif /* * case 3: partial small file at non-zero offset, with header */ rlen = SMALL_FILE_LEN_1 + SMALL_FILE_HEADER_SIZE; if (readn(sockfd, small_buf, rlen) != rlen) { fprintf(stderr, "prsocket_test: SendFile_Client failed to receive file\n"); failed_already=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -