📄 socket.c
字号:
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 + -