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

📄 socket.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        return;    }#ifdef XP_UNIX    if (memcmp(small_file_header, small_buf, SMALL_FILE_HEADER_SIZE) != 0){        fprintf(stderr,            "SendFile 3. ERROR - small file header corruption\n");        failed_already=1;        return;    }    if (memcmp((char *) small_file_addr + SMALL_FILE_OFFSET_1,				small_buf + SMALL_FILE_HEADER_SIZE, SMALL_FILE_LEN_1) != 0) {        fprintf(stderr,            "SendFile 3. ERROR - small file data corruption\n");        failed_already=1;        return;    }#endif	/*	 * case 4: partial small file at non-zero offset, with trailer	 */    rlen = SMALL_FILE_LEN_2 + 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((char *) small_file_addr + SMALL_FILE_OFFSET_2, small_buf,        								SMALL_FILE_LEN_2) != 0) {        fprintf(stderr,            "SendFile 4. ERROR - small file data corruption\n");        failed_already=1;        return;    }    if (memcmp(small_file_trailer, small_buf + SMALL_FILE_LEN_2,        				SMALL_FILE_TRAILER_SIZE) != 0) {        fprintf(stderr,            "SendFile 4. ERROR - small file trailer corruption\n");        failed_already=1;        return;    }#endif	/*	 * case 5: partial large file at non-zero offset, file with header	 */    rlen = LARGE_FILE_LEN_2 + LARGE_FILE_HEADER_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 5. ERROR - large file header corruption\n");        failed_already=1;        return;    }    if (memcmp((char *)large_file_addr + LARGE_FILE_OFFSET_2,					large_buf + LARGE_FILE_HEADER_SIZE,        								LARGE_FILE_LEN_2) != 0) {        fprintf(stderr,            "SendFile 5. ERROR - large file data corruption\n");        failed_already=1;        return;    }#endif	/*	 * case 6: partial small file at non-zero offset, with header	 */    rlen = SMALL_FILE_LEN_3 + 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;        return;    }#ifdef XP_UNIX    if (memcmp(small_file_header, small_buf, SMALL_FILE_HEADER_SIZE) != 0){        fprintf(stderr,            "SendFile 6. ERROR - small file header corruption\n");        return;    }    if (memcmp((char *) small_file_addr + SMALL_FILE_OFFSET_3,				small_buf + SMALL_FILE_HEADER_SIZE, SMALL_FILE_LEN_3) != 0) {#if 0		char *i, *j;		int k;		i = (char *) small_file_addr + SMALL_FILE_OFFSET_3;		j = small_buf + SMALL_FILE_HEADER_SIZE;		k = SMALL_FILE_LEN_3;		while (k-- > 0) {			if (*i++ != *j++)			printf("i = %d j = %d\n",				(int) (i - ((char *) small_file_addr + SMALL_FILE_OFFSET_3)),				(int) (j - (small_buf + SMALL_FILE_HEADER_SIZE)));		}#endif        fprintf(stderr,            "SendFile 6. ERROR - small file data corruption\n");        failed_already=1;        return;    }#endif	/*	 * case 7: partial large file at non-zero offset, with header	 */    rlen = LARGE_FILE_LEN_3 + LARGE_FILE_HEADER_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 7. ERROR - large file header corruption\n");        failed_already=1;        return;    }    if (memcmp((char *)large_file_addr + LARGE_FILE_OFFSET_3,					large_buf + LARGE_FILE_HEADER_SIZE,        								LARGE_FILE_LEN_3) != 0) {        fprintf(stderr,            "SendFile 7. ERROR - large file data corruption\n");        failed_already=1;        return;    }#endif	/*	 * case 8: partial large file at non-zero, page-aligned offset, with	 * header and trailer	 */    rlen = LARGE_FILE_LEN_4 + 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((char *)large_file_addr + LARGE_FILE_OFFSET_4,				large_buf + LARGE_FILE_HEADER_SIZE,        								LARGE_FILE_LEN_4) != 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_4,        				LARGE_FILE_TRAILER_SIZE) != 0) {        fprintf(stderr,            "SendFile 2. ERROR - large file trailer corruption\n");        failed_already=1;        return;    }#endif    PR_DELETE(small_buf);    PR_DELETE(large_buf);    PR_Close(sockfd);    /*     * 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);    DPRINTF(("TransmitFile_Client [0x%lx] exiting\n", PR_GetCurrentThread()));}/* * Serve_TransmitFile_Client *    Thread, started by the server, for serving a client connection. *    Trasmits a small file, with a header, and a large file, without *    a header */static voidServe_TransmitFile_Client(void *arg){    Serve_Client_Param *scp = (Serve_Client_Param *) arg;    PRFileDesc *sockfd;    PRInt32 bytes;    PRFileDesc *local_small_file_fd=NULL;    PRFileDesc *local_large_file_fd=NULL;	PRSendFileData sfd;	PRInt32 slen;    sockfd = scp->sockfd;    local_small_file_fd = PR_Open(SMALL_FILE_NAME, PR_RDONLY,0);    if (local_small_file_fd == NULL) {        fprintf(stderr,"prsocket_test failed to open file for transmitting %s\n",            SMALL_FILE_NAME);        failed_already=1;        goto done;    }    local_large_file_fd = PR_Open(LARGE_FILE_NAME, PR_RDONLY,0);    if (local_large_file_fd == NULL) {        fprintf(stderr,"prsocket_test failed to open file for transmitting %s\n",            LARGE_FILE_NAME);        failed_already=1;        goto done;    }    bytes = PR_TransmitFile(sockfd, local_small_file_fd, small_file_header,        SMALL_FILE_HEADER_SIZE, PR_TRANSMITFILE_KEEP_OPEN,        PR_INTERVAL_NO_TIMEOUT);    if (bytes != (SMALL_FILE_SIZE+ SMALL_FILE_HEADER_SIZE)) {        fprintf(stderr,            "prsocet_test: PR_TransmitFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }    bytes = PR_TransmitFile(sockfd, local_large_file_fd, NULL, 0,        PR_TRANSMITFILE_KEEP_OPEN, PR_INTERVAL_NO_TIMEOUT);    if (bytes != LARGE_FILE_SIZE) {        fprintf(stderr,            "prsocket_test: PR_TransmitFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * PR_SendFile test cases	 */	/*	 * case 1: small file with header and trailer	 */	sfd.fd = local_small_file_fd;	sfd.file_offset = 0;	sfd.file_nbytes = 0;	sfd.header = small_file_header;	sfd.hlen = SMALL_FILE_HEADER_SIZE;	sfd.trailer = small_file_trailer;	sfd.tlen = SMALL_FILE_TRAILER_SIZE;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        				PR_INTERVAL_NO_TIMEOUT);    slen = SMALL_FILE_SIZE+ SMALL_FILE_HEADER_SIZE +						SMALL_FILE_TRAILER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 1. PR_SendFile  send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 2: partial large file at zero offset, file with header and trailer	 */	sfd.fd = local_large_file_fd;	sfd.file_offset = 0;	sfd.file_nbytes = LARGE_FILE_LEN_1;	sfd.header = large_file_header;	sfd.hlen = LARGE_FILE_HEADER_SIZE;	sfd.trailer = large_file_trailer;	sfd.tlen = LARGE_FILE_TRAILER_SIZE;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        				PR_INTERVAL_NO_TIMEOUT);    slen = LARGE_FILE_LEN_1 + LARGE_FILE_HEADER_SIZE +						LARGE_FILE_TRAILER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 2. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 3: partial small file at non-zero offset, with header	 */	sfd.fd = local_small_file_fd;	sfd.file_offset = SMALL_FILE_OFFSET_1;	sfd.file_nbytes = SMALL_FILE_LEN_1;	sfd.header = small_file_header;	sfd.hlen = SMALL_FILE_HEADER_SIZE;	sfd.trailer = NULL;	sfd.tlen = 0;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        				PR_INTERVAL_NO_TIMEOUT);    slen = SMALL_FILE_LEN_1 + SMALL_FILE_HEADER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 3. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 4: partial small file at non-zero offset, with trailer	 */	sfd.fd = local_small_file_fd;	sfd.file_offset = SMALL_FILE_OFFSET_2;	sfd.file_nbytes = SMALL_FILE_LEN_2;	sfd.header = NULL;	sfd.hlen = 0;	sfd.trailer = small_file_trailer;	sfd.tlen = SMALL_FILE_TRAILER_SIZE;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        				PR_INTERVAL_NO_TIMEOUT);    slen = SMALL_FILE_LEN_2 + SMALL_FILE_TRAILER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 4. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 5: partial large file at non-zero offset, file with header	 */	sfd.fd = local_large_file_fd;	sfd.file_offset = LARGE_FILE_OFFSET_2;	sfd.file_nbytes = LARGE_FILE_LEN_2;	sfd.header = large_file_header;	sfd.hlen = LARGE_FILE_HEADER_SIZE;	sfd.trailer = NULL;	sfd.tlen = 0;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        				PR_INTERVAL_NO_TIMEOUT);    slen = LARGE_FILE_LEN_2 + LARGE_FILE_HEADER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 5. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 6: partial small file from non-zero offset till end of file, with header	 */	sfd.fd = local_small_file_fd;	sfd.file_offset = SMALL_FILE_OFFSET_3;	sfd.file_nbytes = 0;				/* data from offset to end-of-file */	sfd.header = small_file_header;	sfd.hlen = SMALL_FILE_HEADER_SIZE;	sfd.trailer = NULL;	sfd.tlen = 0;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        				PR_INTERVAL_NO_TIMEOUT);    slen = SMALL_FILE_LEN_3 + SMALL_FILE_HEADER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 6. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 7: partial large file at non-zero offset till end-of-file, with header	 */	sfd.fd = local_large_file_fd;	sfd.file_offset = LARGE_FILE_OFFSET_3;	sfd.file_nbytes = 0;				/* data until end-of-file */	sfd.header = large_file_header;	sfd.hlen = LARGE_FILE_HEADER_SIZE;	sfd.trailer = NULL;	sfd.tlen = 0;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_KEEP_OPEN,        									PR_INTERVAL_NO_TIMEOUT);    slen = LARGE_FILE_LEN_3 + LARGE_FILE_HEADER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 7. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }	/*	 * case 8: partial large file at non-zero page-aligned offset,	 * with header and trailer	 */	sfd.fd = local_large_file_fd;	sfd.file_offset = LARGE_FILE_OFFSET_4;	sfd.file_nbytes = LARGE_FILE_LEN_4;	sfd.header = large_file_header;	sfd.hlen = LARGE_FILE_HEADER_SIZE;	sfd.trailer = large_file_trailer;	sfd.tlen = LARGE_FILE_TRAILER_SIZE;    bytes = PR_SendFile(sockfd, &sfd, PR_TRANSMITFILE_CLOSE_SOCKET,        				PR_INTERVAL_NO_TIMEOUT);    slen = LARGE_FILE_LEN_4 + LARGE_FILE_HEADER_SIZE +						LARGE_FILE_TRAILER_SIZE;    if (bytes != slen) {        fprintf(stderr,			"socket: Error - 2. PR_SendFile send_size = %d, bytes sent = %d\n",									slen, bytes);        fprintf(stderr,            "prsocket_test: PR_SendFile failed: (%ld, %ld)\n",            PR_GetError(), PR_GetOSError());        failed_already=1;    }done:    if (local_small_file_fd != NULL)        PR_Close(local_small_file_fd);    if (local_large_file_fd != NULL)        PR_Close(local_large_file_fd);}/* * TransmitFile Server

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -