{This program has a major bug which locks up the system after the first packet is received. I have no clue as to what causes this, and I would appreciate any input.} program receive; uses IPX; const receive_socket = $7777; send_socket = $6666; maxtime = 99999; null = ptr(0,0); var user_network_number:networkNumber; user_node:NetworkNode; done:boolean; timer:word; rec_file:text; receive_ecb:ecb; receive_header:IPXHeader; receive_message:string; send_ecb:ecb; send_header:IPXHeader; send_message:string; packet_count:integer; hr,mn,start,s100:longint; procedure sti; begin asm sti end; end; procedure abort(error:string); begin writeln; writeln(error); halt(0); end; procedure open_user_sockets_and_file; begin IPXCloseSocket(receive_socket); IPXCloseSocket(send_socket); if IPXOpenSocket(receive_socket) <> 0 then abort('Error opening socket') else if IPXOpenSocket(send_socket) <> 0 then abort('Error opening socket') else begin assign(rec_file,paramSTR(1)); rewrite(rec_file); end; end; procedure receive_routine; interrupt; begin IPXReceive(receive_ecb,receive_header,receive_socket,@receive_message, sizeof(receive_message),@receive_routine); asm pop bp pop es pop ds pop di pop si pop dx pop cx pop bx pop ax retf end; end; procedure establish_connection_to_remote_user; var connection:integer; procedure add255(var num:NetworkNumber; var node:NetworkNode); var x:integer; begin for x:=0 to 3 do num[x]:=$ff; for x:=0 to 5 do node[x]:=$ff; end; procedure fix_address(var num:NetworkNumber; var node:NetworkNode; Address:IPXHeader); var x:integer; begin for x:=0 to 3 do num[x] := address.source_network_number[x]; for x:=0 to 5 do node[x] := address.source_network_node[x]; end; begin add255(User_network_number,user_node); User_network_number[0]:=9; User_network_number[1]:=90; User_network_number[2]:=0; User_network_number[3]:=6; receive_message := ''; IPXReceive(receive_ecb,receive_header,receive_socket,@receive_message, sizeof(receive_message),@receive_routine); send_message := 'Looking for Greg Millers host'; repeat IPXSend(User_network_number, User_node, receive_socket, @send_message, length(send_message)+1,send_ecb,send_header,send_socket,null); write(receive_message); until (receive_message = 'Greg Millers host hears you'); fix_address(User_network_number,User_node,receive_header); { User_network_number[0]:=9; User_network_number[1]:=90; User_network_number[2]:=0; User_network_number[3]:=3; user_Node[0]:=16; User_node[1]:=0; user_node[2]:=90; user_node[3]:=172; user_node[4]:=99; user_node[5]:=235; receive_message := ''; IPXReceive(receive_ecb,receive_header,receive_socket,@receive_message, sizeof(receive_message),null); send_message := 'Looking for Greg Millers host'; repeat IPXSend(User_network_number, User_node, receive_socket, @send_message, length(send_message)+1,send_ecb,send_header,send_socket,null); write(receive_message); until receive_message = 'Greg Millers host hears you'; fix_address(User_network_number,User_node,receive_header); { connection := Get1stConnectionNumber(ParamSTR(1)); if Connection = 0 then abort('User not found') else If getInternetAddress(connection, user_network_number, user_node) <> 0 then abort('Network error');} end; procedure get_ready_to_begin_file_receive; const null = ptr(0,0); var receive_ecb:ecb; receive_header:IPXHeader; receive_Message:string; send_ecb:ecb; send_header:IPXHeader; send_message:string; receive_ecb:ecb; receive_header:IPXHeader; receive_Message:string; send_ecb:ecb; send_header:IPXHeader; send_message:string; begin receive_message := ''; IPXReceive(receive_ecb,receive_header,receive_socket,@receive_message, sizeof(receive_message),null); send_message := 'GO!'; repeat begin IPXSend(User_network_number, User_node, receive_socket, @send_message, length(send_message)+1,send_ecb,send_header,send_socket,null); end; until (receive_ecb.Completion_code <> 0) or (receive_ecb.in_use <> 0) or (receive_message <> 'GO!') end; procedure send_service_routine; interrupt; begin asm pop bp pop es pop ds pop di pop si pop dx pop cx pop bx pop ax retf end; end; procedure send_packet; begin IPXSend(user_network_number,User_node,Receive_socket,@send_message, length(send_message)+1,send_ecb,send_header,send_socket, @send_service_routine); end; procedure store_packet; begin inc(packet_count); write(receive_message); write(rec_file,receive_message); send_packet; end; {$F+} procedure receive_service_routine;{$F-} {A receive indicates a packet has arrived} interrupt; begin sti; if receive_message = 'GO!' then begin send_message := 'GO!'; send_packet; end else begin store_packet; IPXReceive(receive_ecb,receive_header,receive_socket, @receive_message,sizeof(receive_message), @receive_service_routine); send_packet; {Send Acknowledgemnet} {getTime(hr,mn,start,s100);} start:=0; end; asm pop bp pop es pop ds pop di pop si pop dx pop cx pop bx pop ax retf end; {Program locks up here} end; procedure receive_file; begin IPXReceive(receive_ecb,receive_header,receive_socket, @receive_message,sizeof(receive_message), @receive_service_routine); done:=false; while not done do begin {getTime(hr,mn,timer,s100);}Inc(start); if start > maxtime then send_packet; end; end; begin if not IPXInstalled then writeln('IPX Not installed'); writeln('Opening files'); open_user_sockets_and_file; writeln('Connecting to remote user'); establish_connection_to_remote_user; writeln('Getting ready to receive'); Get_ready_to_begin_file_receive; writeln('Receiving'); receive_file; close(rec_file); end. receive'); Get_ready_to_begin_file_receive; writeln('Receiving'); receive_file; close(rec_file); end.