⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        }    }    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 + -