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

📄 spxrec.c

📁 IPX协议C程序源代码:用于网络通信
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <mem.h>
#include <string.h>
#include <dos.h>
#include "ipx.h"
#include "spx.h"

#define our_socket 0x4343
#define your_socket 0x5353
#define ecb_num 5
#define max_message 100

struct SPXECB receive_ecb[ecb_num],call_ecb;
struct SPXHEADER receive_header[ecb_num],call_header;
struct STABUF reply_buffer;

volatile int event_completed_flag;

void far call_esr(void)
	{
	_AX=_ES;
	_DS=_AX;
	event_completed_flag=1;
	}

void make_connection(char *packet_ptr,
		     int packet_len,unsigned int *connection_id)
	{
	int i,dest_connection_number;
	unsigned int old_time;

	open_socket(our_socket);
	for(i=0;i<ecb_num;i++)
		{
		memset(&receive_ecb[i],0,sizeof(struct SPXECB));
		memset(&receive_header[i],0,sizeof(struct SPXHEADER));
    		
		receive_ecb[i].socket_number=our_socket;
    		receive_ecb[i].packet_count=2;
    		receive_ecb[i].packet[0].address=&receive_header[i];
    		receive_ecb[i].packet[0].length=sizeof(struct SPXHEADER);
    		receive_ecb[i].packet[1].address=packet_ptr;
	 	receive_ecb[i].packet[1].length=*packet_len;
	
		spx_listen_for_sequenced_packet(&receive_ecb[i]);
        	}
		
	dest_connection_number=get_1st_connection_num("ll");
	if (dest_connection_num==0) return;

	memset(&call_ecb,0,sizeof(struct SPXECB));
	memset(&call_header,0,sizeof(struct SPXHEADER));

	get_internet_address(dest_connection_number,
			     call_header.dest_network_number,
			     call_header.dest_network_node)
	call_header.dest_network_socket=your_socket;

	event_completed_flag=0;
	call_ecb.event_service_routine=call_esr;
	call_ecb.socket_number=our_socket;
    	call_ecb.packet_count=1;
    	call_ecb.packet[0].address=&call_header;
    	call_ecb.packet[0].length=sizeof(struct SPXHEADER);

	spx_establish_connection(&call_ecb);

	old_time=get_interval_marker();
	while(call_ecb.in_use&&!kbhit())
		{
		printf("Waiting establishing connection...\n");
		if (get_interval_marker()-old_time>18.2*60)
			{
			*connection_id=0;
			return;
			}
		connection_id=call_ecb.source_connection_id;
		}
	}

int receive(void *packet_ptr,int packet_len)
	{
	int i;

	for (i=0;i<ecb_num;i++)
		{
		if ((receive_ecb[i].in_use==0)&&(receive_ecb[i].completion_code==0))
			break
		}
	if (i>=ecb_num)
		return
	else
		{
		memset(&receive_ecb[i],0,sizeof(struct SPXECB));
		memset(&receive_header[i],0,sizeof(struct SPXHEADER));

		receive_ecb[i].socket_number=our_socket;
		receive_ecb[i].packet_count=2;
		receive_ecb[i].packet[0].address=&receive_header[i];
		receive_ecb[i].packet[0].length=sizeof(struct SPXHEADER);
		receive_ecb[i].packet[1].address=packet_ptr;
		receive_ecb[i].packet[1].length=packet_len;
		connection_id=connect_id;

		spx_listen_for_sequenced_packet(&receive_ecb[i]);

		return (1);
		}
	}

main()
	{
	int i,message_len,message_num=0;
	unsigned int *p;
	unsigned int connect_id;
	char receive_message[max_message];
	unsigned int old_time1;
	char send_message[100];

	i=ipx_spx_installed();
	if (i<1) 
		{
		printf("!!SPX is not loaded, please load SPX first.\n")
		return;
		}
	
	p=(unsigned int *)malloc(2);

	memset(receive_message,0,max_message);
	message_len=max_message;

	make_connection(receive_message,message_len,p);
	connect_id=*p;
	free(p);

	if (!connection_id)
		{
		close_socket(our_socket);
		printf("\n!No other station answer me,
			   the connection can not be established!\n");
		return;
		}
	
	memset(&reply_buffer,0,sizeof(struct STABUF));
	spx_get_connection_status(&reply_buffer,connection_id);

	while(1)
		{
		old_time1=get_interval_marker();
		i=receive(receive_message,message_len);		
		if (i==1)
			{
			message_num=message_num+1;;
			printf("Message %d received:%s\n\n".message_num,receive_message);
			}
		else
			{
			 printf("Waiting for message...\n");
			 break;
			}
		while (get_interval_marker()-old_time1<19);

		memset(&reply_buffer,0,sizeof(struct STABUF));
		spx_get_connection_status(&reply_buffer,connection_id);
		if (!reply_buffer.connect_status)
			{
			close_socket(our_socket);
			return;
			}
		}
	}

⌨️ 快捷键说明

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