c# tcp not working outside intranet - c#

Server :
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Parse("90.181.x.xxx"), 23466));
socket.Listen(1);
Socket accepteddata = socket.Accept();
data = new byte[accepteddata.SendBufferSize]; 6
int j = accepteddata.Receive(data);
byte[] adata = new byte[j];
for (int i = 0; i < j; i++)
adata[i] = data[i];
string dat = Encoding.Default.GetString(adata);
MessageBox.Show(dat);
And client:
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
s.Connect(IPAddress.Parse("90.181.x.xxx"), 23466);
string q = "It work";
byte[] data = Encoding.Default.GetBytes(q);
s.Send(data);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
The problem is when my friend connect to it he gets error.Yes I have port forwarded.I have set up like this Internal/External port start/end to 23466 and ip address to 192.168.1.1

this line here:
socket.Bind(new IPEndPoint(IPAddress.Parse("90.181.x.xxx"), 23466));
should be:
socket.Bind(new IPEndPoint(IPAddress.Any, 23466));
Of course you can bind to a specific IP address but it shouldn't be hard coded. "IPAddress.Any" should bind the socket to all addresses on the local machine. The problem you are having is you can't bind to the address of another machine(router).
also, does this code even compile? what does the '6' do?
data = new byte[accepteddata.SendBufferSize]; 6
The code is weird anyhow. After running the server try opening the command prompt and type "telnet localhost 23466" see if it opens a connection. Your friend or you, doesn't matter can also do "telnet 90.181.x.x 23466"
Make sure you close your sockets when you're finished with them.

Related

Parse IPAddress from text file (loaded into string)

I'm trying to get my client app to connect to a server on a remote machine operating on my local network without knowing the server's IP Address to begin with.
Ideally I'd like the client to connect automatically, but since I've been having trouble getting that to work properly, I thought for now I'd have the user manually input their server's IP Address into the client.
I've saved the inputted IP address to a file and loaded it into a string:
string ServerIP = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + #"/ServerIP.cfg");
but I'm not sure how to set that string as the IPEndPoint:
private IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("Insert ServerIP string here"), 8888);
I've unsuccessfully tried using ipString, IPAddress.Parse(ServerIP, 8888);, IPAddress.Parse(string ServerIP, 8888); and multiple other combinations, I still can't figure out the proper syntax for this method, and my Google-fu has failed me on this one.
EDIT: With this implementation I don't get any errors until I try to debug, and I get:
"An unhandled exception of type 'System.ArgumentNullException' occurred in System.dll
Additional information: Value cannot be null." on Client.Connect(serverEndPoint);
private IPEndPoint serverEndPoint;
private TcpClient Client = new TcpClient();
public Client()
{
InitializeComponent();
Client.Connect(serverEndPoint);
string ServerIP = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + #"/ServerIP.cfg");
serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), 8888);
}
IPAddress.Parse only takes one argument, I believe you meant to put the port in the IPEndPoint constructor and not the Parse method.
private IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), 8888);

Sending Any File to localhost

I want to keep the database Files only on the server so when i upload a file i want to send it to "127.0.0.1" i tried the following code
private void SendFile(string fileName = "C:\\test.txt")
{
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
Socket client = new Socket(ipAddr.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
client.Connect(ipEndPoint);
byte[] fileBytes = File.ReadAllBytes(fileName);
client.Send(fileBytes);
client.Shutdown(SocketShutdown.Both);
client.Close();
}
But it keep getting me this Error : "No connection could be made because the target machine actively refused it " Which Means Server is not listening.
So,
1) How fix this in order to be able to send any file to localhost
2) How i can open files in the browser via "127.0.0.1[FileName].[Ext]"
You need to write something to listen to the port using the SocketServer class. The code you wrote expects a server to be listening to a connection in the 11000. This is done using the Listener.Listen() method. A full example: http://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx

C# Listenin 5060 Port [duplicate]

This question already has an answer here:
Closed 10 years ago.
Possible Duplicate:
Listening to Port 5060
I am developing a SIP client.And I have a question.
I want listen 5060 port for catch the SIP Server Message.For this,I coding something.(Also I take admin rights in program)
But I get SocketException: "An attempt was made to access a socket in a way forbidden by its access permissions" (Native error code: 10013)...
My Code:
private void ListenPort() {
WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);
TcpListener server = null;
Int32 port = 5060;
IPAddress localAddr = IPAddress.Parse("192.168.1.33");
server = new TcpListener(localAddr, port);
Byte[] bytes = new Byte[1000];
String data = null;
while (hasAdministrativeRight == true)
{
server.Start();
int i = 0;
while (1==1)
{
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
data = null;
i = stream.Read(bytes, 0, bytes.Length);
data += System.Text.Encoding.ASCII.GetString(bytes, 0, i);
label3.Text += data;
this.Refresh();
Thread.Sleep(500);
}
}
}
Where do you think the problem?
Have you checked that no other program is already using port 5060? That's what this error can mean.
See this discussion on the matter: http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/d23d471c-002a-4958-829e-eb221c8a4b76/
You need to call server.Start() outside the while loop and before the first AcceptTcpClient call.
Also try using IPAddress.Any instead of IPAddress.Parse("192.168.1.33") for your listener ip
Make sure any other SIP Server program not installed as a Windows service which has using according port.
Type in netstat -an and it will show you the “listening” ports or try to googling port check softwares.
And check your SIP Server configuration for is it running over TCP or UDP.

Error in receiving data in C# client socket from java server socket

I am creating a Socket connection with C# client socket and Java Server Socket.
When i am sending data from client socket,the server socket is properly receiving that data.
But when i am trying to send data back to Client socket from Server socket it is getting hanged on client side in receiving data.
Client Side Code(In C#.net)
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
string hostName = System.Net.Dns.GetHostName();
System.Net.IPHostEntry hostEntry = System.Net.Dns.GetHostEntry(hostName);
System.Net.IPAddress[] ipAddresses = hostEntry.AddressList;
System.Net.IPEndPoint remoteEP =
new System.Net.IPEndPoint(ipAddresses[ipAddresses.Length - 1], port);
clientSocket.Connect(remoteEP);
string sendData = inputFilePath;
byte[] byteDataSend = System.Text.Encoding.ASCII.GetBytes(sendData);
clientSocket.Send(byteDataSend);
int receivedBufferSize = clientSocket.ReceiveBufferSize;
byte[] recivedData = new Byte[receivedBufferSize];
int receivedDataLength = clientSocket.Receive(recivedData);
string stringData = Encoding.ASCII.GetString(recivedData, 0, receivedDataLength);
textFilePath = stringData;
Console.Write(stringData);
clientSocket.Close();
Server Socket Code (In Java)
Socket connection = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
fileName = in.readLine();
convertedFile =runConverter.convertDocumet(fileName);
byte[] sendingData = convertedFile.getBytes("US-ASCII");
DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
dos.write(sendingData, 0, sendingData.length);
Tell me what is problem??
Please help...
The usual problem with that kind of c# code is the synchronous receive.
I always recommend doing an asynchronous read, as in this answer.
I'm not positive that that's the source of your problem, but if you implemented the asynchronous receive with a bit of logging there's a good chance that that will either fix your problem or make it much more obvious as to what your problem is.
A hang on synchronous receive does suggest that the Java isn't sending data to the same socket that the c# is listening on, so double-checking those endpoints can also be a good idea.
Hope that helps!

How can i get a file from remote machine?

How can i get a file from remote computer? i know remote computer ip and 51124 port is open. i need this algorith:(this is a Windows Application visual studio 2008)
1) Connect 192.xxx.x.xxx ip via 51124 port
2) filename:123456 (i want to search it on remote machine)
3) Get File
4) Save C:\
51124 port is open. can i access and can i search any file according to filename?
My code is below:
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 51124);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sock.Bind(ipEnd);
sock.Listen(maxConnections);
Socket serverSocket = sock.Accept();
byte[] data = new byte[bufferSize];
int received = serverSocket.Receive(data);
int filenameLength = BitConverter.ToInt32(data, 0);
string filename = Encoding.ASCII.GetString(data, 4, filenameLength);
BinaryWriter bWrite = new BinaryWriter(File.Open(outPath + filename, FileMode.Create));
bWrite.Write(data, filenameLength + 4, received - filenameLength - 4);
int received2 = serverSocket.Receive(data);
while (received2 > 0) {
bWrite.Write(data, 0, received2);
received2 = serverSocket.Receive(data);
}
bWrite.Close();
serverSocket.Close();
sock.Close();
MyQuery(targetip, port, filename) i can use it like that: MyQuery(192.xxx.x.xxx,51124,"MyNeddedFile");
MyQuery(targetip, port, filename)
{
.....
...
..
.
}
You have been trying to ask this question a few times now - perhaps this explains why we cannot answer your question:
If you have an FTP server, it will (by default) listen on port 21. So if I send a message according to the FTP protocol to port 21, it will respond.
If I have apache or IIS (or some other webserver) listening on for instance port 80, and I send an FTP message to it, it will give me an error, because they are expecting HTTP requests.
Without knowing what application is listening on port 51124, we can't possibly tell you how to talk to it.

Categories

Resources