📄 nbconn.c
字号:
Server_Param sp; char send_buf[DATA_BUF_SIZE], recv_buf[DATA_BUF_SIZE]; PRIntn default_case, n, bytes_read, bytes_sent; PRIntn failed_already = 0; /* * Create a tcp socket */ if ((sockfd = PR_NewTCPSocket()) == NULL) { fprintf(stderr,"Error - PR_NewTCPSocket failed\n"); failed_already=1; goto def_exit; } memset(&netaddr, 0 , sizeof(netaddr)); netaddr.inet.family = PR_AF_INET; netaddr.inet.port = PR_htons(TCP_SERVER_PORT); netaddr.inet.ip = PR_htonl(PR_INADDR_ANY); /* * try a few times to bind server's address, if addresses are in * use */ i = 0; while (PR_Bind(sockfd, &netaddr) < 0) { if (PR_GetError() == PR_ADDRESS_IN_USE_ERROR) { netaddr.inet.port += 2; if (i++ < SERVER_MAX_BIND_COUNT) continue; } fprintf(stderr,"ERROR - PR_Bind failed: (%d,%d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } if (PR_Listen(sockfd, 32) < 0) { fprintf(stderr,"ERROR - PR_Listen failed: (%d,%d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } if (PR_GetSockName(sockfd, &netaddr) < 0) { fprintf(stderr,"ERROR - PR_GetSockName failed: (%d,%d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } if ((conn_fd = PR_NewTCPSocket()) == NULL) { fprintf(stderr,"Error - PR_NewTCPSocket failed\n"); failed_already=1; goto def_exit; } optData.option = PR_SockOpt_Nonblocking; optData.value.non_blocking = PR_TRUE; PR_SetSocketOption(conn_fd, &optData); rv = PR_Connect(conn_fd, &netaddr, PR_INTERVAL_NO_TIMEOUT); if (rv == PR_FAILURE) { if (PR_GetError() == PR_IN_PROGRESS_ERROR) { DPRINTF(("Connect in progress\n")); } else { fprintf(stderr,"Error - PR_Connect failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } } /* * Now create a thread to accept a connection */ sp.sp_fd = sockfd; thr = PR_CreateThread(PR_USER_THREAD, TCP_Server, (void *)&sp, PR_PRIORITY_NORMAL, PR_LOCAL_THREAD, PR_JOINABLE_THREAD, 0); if (thr == NULL) { fprintf(stderr,"Error - PR_CreateThread failed: (%d,%d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } DPRINTF(("Created TCP_Server thread [0x%x]\n",thr)); pd.fd = conn_fd; pd.in_flags = PR_POLL_WRITE | PR_POLL_EXCEPT;#ifndef XP_MAC n = PR_Poll(&pd, 1, PR_INTERVAL_NO_TIMEOUT);#else n = PR_Poll(&pd, 1, timeout);#endif if (n == -1) { fprintf(stderr,"Error - PR_Poll failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } if (PR_GetConnectStatus(&pd) == PR_SUCCESS) { PRInt32 rv; DPRINTF(("Connection successful\n")); /* * Write some data, read it back and check data integrity to * make sure the connection is good */ pd.in_flags = PR_POLL_WRITE; bytes_sent = 0; memset(send_buf, 'a', DATA_BUF_SIZE); while (bytes_sent != DATA_BUF_SIZE) { rv = PR_Poll(&pd, 1, PR_INTERVAL_NO_TIMEOUT); if (rv < 0) { fprintf(stderr,"Error - PR_Poll failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } PR_ASSERT((rv == 1) && (pd.out_flags == PR_POLL_WRITE)); rv = PR_Write(conn_fd, send_buf + bytes_sent, DATA_BUF_SIZE - bytes_sent); if (rv < 0) { fprintf(stderr,"Error - PR_Write failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } PR_ASSERT(rv > 0); bytes_sent += rv; } DPRINTF(("Bytes written to server - %d\n",bytes_sent)); PR_Shutdown(conn_fd, PR_SHUTDOWN_SEND); pd.in_flags = PR_POLL_READ; bytes_read = 0; memset(recv_buf, 0, DATA_BUF_SIZE); while (bytes_read != DATA_BUF_SIZE) { rv = PR_Poll(&pd, 1, PR_INTERVAL_NO_TIMEOUT); if (rv < 0) { fprintf(stderr,"Error - PR_Poll failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } PR_ASSERT((rv == 1) && (pd.out_flags == PR_POLL_READ)); rv = PR_Read(conn_fd, recv_buf + bytes_read , DATA_BUF_SIZE - bytes_read); if (rv < 0) { fprintf(stderr,"Error - PR_Read failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } PR_ASSERT(rv != 0); bytes_read += rv; } DPRINTF(("Bytes read from server - %d\n",bytes_read)); /* * verify the data read */ if (memcmp(send_buf, recv_buf, DATA_BUF_SIZE) != 0) { fprintf(stderr,"ERROR - data corruption\n"); failed_already=1; goto def_exit; } DPRINTF(("Data integrity verified\n")); } else { fprintf(stderr,"PR_GetConnectStatus: connect failed: (%ld, %ld)\n", PR_GetError(), PR_GetOSError()); failed_already = 1; goto def_exit; }def_exit: if (thr) { PR_JoinThread(thr); thr = NULL; } if (sockfd) { PR_Close(sockfd); sockfd = NULL; } if (conn_fd) { PR_Close(conn_fd); conn_fd = NULL; } if (failed_already) return 1; else return 0;}/* * test for connection to a non-existent port using a non-blocking socket */static PRIntnconnection_failure_test(){ PRFileDesc *sockfd = NULL, *conn_fd = NULL; PRNetAddr netaddr; PRInt32 i, rv; PRPollDesc pd; PRSocketOptionData optData; PRIntn n, failed_already = 0; /* * Create a tcp socket */ if ((sockfd = PR_NewTCPSocket()) == NULL) { fprintf(stderr,"Error - PR_NewTCPSocket failed\n"); failed_already=1; goto def_exit; } memset(&netaddr, 0 , sizeof(netaddr)); netaddr.inet.family = PR_AF_INET; netaddr.inet.port = PR_htons(TCP_SERVER_PORT); netaddr.inet.ip = PR_htonl(PR_INADDR_ANY); /* * try a few times to bind server's address, if addresses are in * use */ i = 0; while (PR_Bind(sockfd, &netaddr) < 0) { if (PR_GetError() == PR_ADDRESS_IN_USE_ERROR) { netaddr.inet.port += 2; if (i++ < SERVER_MAX_BIND_COUNT) continue; } fprintf(stderr,"ERROR - PR_Bind failed: (%d,%d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } if (PR_GetSockName(sockfd, &netaddr) < 0) { fprintf(stderr,"ERROR - PR_GetSockName failed: (%d,%d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; }#ifdef AIX /* * On AIX, set to unused/reserved port */ netaddr.inet.port = PR_htons(TCP_UNUSED_PORT);#endif if ((conn_fd = PR_NewTCPSocket()) == NULL) { fprintf(stderr,"Error - PR_NewTCPSocket failed\n"); failed_already=1; goto def_exit; } optData.option = PR_SockOpt_Nonblocking; optData.value.non_blocking = PR_TRUE; PR_SetSocketOption(conn_fd, &optData); rv = PR_Connect(conn_fd, &netaddr, PR_INTERVAL_NO_TIMEOUT); if (rv == PR_FAILURE) { DPRINTF(("PR_Connect to a non-listen port failed: (%d, %d)\n", PR_GetError(), PR_GetOSError())); } else { PR_ASSERT(rv == PR_SUCCESS); fprintf(stderr,"Error - PR_Connect succeeded, expected to fail\n"); failed_already=1; goto def_exit; } pd.fd = conn_fd; pd.in_flags = PR_POLL_WRITE | PR_POLL_EXCEPT;#ifndef XP_MAC n = PR_Poll(&pd, 1, PR_INTERVAL_NO_TIMEOUT);#else n = PR_Poll(&pd, 1, timeout);#endif if (n == -1) { fprintf(stderr,"Error - PR_Poll failed: (%d, %d)\n", PR_GetError(), PR_GetOSError()); failed_already=1; goto def_exit; } if (PR_GetConnectStatus(&pd) == PR_SUCCESS) { PRInt32 rv; fprintf(stderr,"PR_GetConnectStatus succeeded, expected to fail\n"); failed_already = 1; goto def_exit; } rv = PR_GetError(); DPRINTF(("Connection failed, successfully with PR_Error %d\n",rv));def_exit: if (sockfd) { PR_Close(sockfd); sockfd = NULL; } if (conn_fd) { PR_Close(conn_fd); conn_fd = NULL; } if (failed_already) return 1; else return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -