Windows 2000 'hanging' IP ports

Lars H. Larsen, ICCC <>
Mon Feb 3 15:28:45 CET 2003


Hello to all Guru's and wizards
does anybody have expirence here ???

I have a client/server application that did run fine with the socket library in earlier OTP releases , but after an upgrade to  OTP R9 -0 I have to use gen_tcp and it gives me problems in Win2k and XP

I made a small test application to isolate the problem.
you'll  find it below 

-when the client dies , there is no problems when reconnecting  and data xfer later

but if the server dies they seem to reconnet but The data xfer is fucked up it's just "TIMEOUT" on both ends.

the program automatically descide wether it should be server or client.

what is happening ??

Regards Lars Larsen

__________________________________________ cut her


-module(test).

-export([start/2]).
-record(socket,{ip, datsoc,	listsoc,type}).

start(Name,Iterations) when integer(Iterations) ->
	start(Name,5999,Iterations).

start(Name,Port,Iterations) ->  
	 case gen_tcp:connect(Name,Port, [{packet,2},{active,true},{reuseaddr, true}]) of
		{error,_Reason} -> 
				io:format("connect error ~p~n",[_Reason]),
				runserver(Name,Iterations,Port);
			
		{ok,Socket} ->
			io:format("Client~n"),
			gen_tcp:send(Socket,"go ahead server"),
			clientping(Iterations,#socket{type=client ,datsoc = Socket, ip = Name})

							
	end.
	

clicon(Iterations,Rec)->
		gen_tcp:close(Rec#socket.datsoc),
		%io:format("~p~n",[erlang:ports()]),

		case gen_tcp:connect(Rec#socket.ip,5999, [{packet,2},{active,true},{reuseaddr, true}]) of
 			{ok,Socket} ->
				clientping(Iterations,Rec#socket{type=client ,datsoc = Socket});
			{error,_X} ->
				clicon(Iterations,Rec);
			_P	 -> io:format("clicon ~p~n",[_P])
		end.



runserver(Name,Iterations,Port) ->
		io:format("Server~n"),
		case gen_tcp:listen(Port,[{packet, 2}, {active,true},{reuseaddr, true}]) of
		{error,_Any}	->
				io:format("Listen result ~p~n",[_Any]);
		{ok,ListenSocket} ->
					io:format("Listen ok~n"),
					{ok,Socket}= gen_tcp:accept(ListenSocket),
					io:format("Accepted ok ~p ~n",[Iterations]),
					serverping(Iterations,#socket{type=server,datsoc = Socket,listsoc=ListenSocket,ip=Name})
		end.
				
clientping(0,Rec) ->
		gen_tcp:close(Rec#socket.datsoc),
		io:format("the end ~n");
clientping(Iterations,Rec) ->
		%io:format("Loop ~p  Rec ~p  ~n",[Iterations,Rec]),
		receive
		{tcp,Datsoc,Data} ->
 				io:format("~w :GOT Data:~p ~n",[Rec#socket.type,Data]),
				gen_tcp:send(Datsoc,"Are you well"),
				 clientping(Iterations-1,Rec);

		{tcp_closed,Consocket} -> 
					io:format("{tcp_closed,Consocket}~n"),
					clicon(Iterations,Rec);
		 Thing ->
		 		io:format(" ~p :GOT: ~p",[Rec#socket.type,Thing]),
				 clientping(Iterations-1,Rec)
		 		
		 after 1000->
		 		io:format("TIMEOUT ~p ~n",[Rec]),
			 	clientping(Iterations-1,Rec)
 
		 		 			
	 	end.
		
	


serverping(0,Rec) ->
	gen_tcp:close(Rec#socket.datsoc),
	gen_tcp:close(Rec#socket.listsoc),
	io:format("the end ~n");
serverping(Iterations,Rec) ->
		%io:format("Loop ~p  Rec ~p~n",[Iterations,Rec]),
		receive
		{tcp,Datsoc,Data} ->
 			io:format("~w :GOT Data:~p ~n",[Rec#socket.type,Data]),
			gen_tcp:send(Rec#socket.datsoc,"fine Thank you "),
		 serverping(Iterations-1,Rec);
		
		{tcp_closed,Soc} ->
			gen_tcp:close(Rec#socket.listsoc),
			gen_tcp:close(Rec#socket.datsoc),
			runserver(Rec#socket.ip,Iterations,5999);	
			
		 Thing ->
		 			io:format(" ~p :GOT: ~p",[Rec#socket.type,Thing]),
					 serverping(Iterations-1,Rec)
		 			
		 after 1000->
		 			io:format("TIMEOUT ~p ~n",[Rec]),
					 serverping(Iterations-1,Rec)
		 
		 		 			
		 end.
		
	


	
	
	

	





More information about the erlang-questions mailing list