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

📄 nbconn.c

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