C# TCP-Socket-Fehler 10060
Ich habe einen windows-Dienst als server fungieren. Und ich führe eine windows-form-Anwendung der form localhost als client. Beide Programme verwenden die TCP-socket-Verbindung zum senden/empfangen von Daten.
Server lauscht auf port 8030. Das Programm funktioniert einwandfrei.
Aber wenn ich den enhanced client-Programm, um die Kommunikation auf bestimmten port sagen wir mal 9030. Während die erste Verbindung zum server generiert es die folgende Ausnahme.
Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nicht ordnungsgemäß reagiert nach einer gewissen Zeit, oder die hergestellte Verbindung war fehlerhaft, da der verbundene host nicht reagiert 192.168.10.198:8030
Jeder Vorschlag wird sehr geschätzt werden.
Dank,
Madhusmita
Für refrence
- Server-Programm-Code
public partial class TestService : ServiceBase
{
Socket serverSocket = null;
public Timer timer1;
IPEndPoint ipEndPoint;
public TestService()
{
InitializeComponent();
timer1 = new Timer(10000);
timer1.Elapsed += new ElapsedEventHandler(timer1_Elapsed);
}
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("Application", "Service started", EventLogEntryType.Information, 555);
try
{
ipEndPoint = new IPEndPoint(IPAddress.Any, 8030);
//Defines the kind of socket we want :TCP
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
//Bind the socket to the local end point(associate the socket to local end point)
serverSocket.Bind(ipEndPoint);
//listen for incoming connection attempt
//Start listening, only allow 10 connection to queue at the same time
serverSocket.Listen(10);
timer1.Start();
}
catch (SocketException ex)
{
EventLog.WriteEntry("Application", ex.ErrorCode + "-" +ex.Message, EventLogEntryType.Error, 555);
}
catch (Exception ex)
{
EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error, 555);
}
}
void timer1_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
//The program is suspended while waiting for an incoming connection.
//This is a synchronous TCP application
Socket handler = serverSocket.Accept();
byte[] fileDetails = new byte[1500];
//Recieve the file details
handler.Receive(fileDetails);
int fileNameLength = BitConverter.ToInt32(fileDetails, 0);
string fileName = Encoding.ASCII.GetString(fileDetails, 4, fileNameLength);
int fileLength = BitConverter.ToInt32(fileDetails, 4 + fileNameLength);
FileStream fs = new FileStream(@"C:\Demo\" + fileName, FileMode.Append, FileAccess.Write);
int byteRead = 0;
while (byteRead < fileLength)
{
byte[] data = new Byte[1500];
//Recieve teh data and write to the file
int r = handler.Receive(data);
fs.Write(data, 0, r);
byteRead += r;
}
fs.Close();
EventLog.WriteEntry("Application", "File saved successfully", EventLogEntryType.SuccessAudit, 555);
EndPoint endPoint = (EndPoint)ipEndPoint;
handler.Send(Encoding.ASCII.GetBytes("Done"));
handler.Close();
}
catch (SocketException ex)
{
EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error, 555);
}
catch (IOException ex)
{
EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error, 555);
}
catch (Exception ex)
{
EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error, 555);
}
}
protected override void OnStop()
{
timer1.Stop();
}
protected override void OnPause()
{
timer1.Stop();
}
protected override void OnContinue()
{
timer1.Start();
}
protected override void OnShutdown()
{
timer1.Stop();
}
}
- Client-Programm-Code
public partial class Form1 : Form
{
Socket socketClient;
IPEndPoint remoteEndPoint;
public Form1()
{
InitializeComponent();
}
private void buttonX1_Click(object sender, EventArgs e)
{
try
{
//Code to connect to server by by specifing the IP and port of the server on
//which the server application is hosted
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//socketClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,(int)1);
//IP address of the machine where the server program is hosted
IPAddress remoteIPAddress = IPAddress.Parse(txtXIPAddress.Text.Trim());
//Specify the specific port no thart the server listens to accept the data
int port = int.Parse(txtXPort.Text.Trim());
remoteEndPoint = new IPEndPoint(remoteIPAddress, port);
**//This two line causing the exception**
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9030);
socketClient.Bind(endPoint);
//Establish the connection to server
socketClient.Connect(remoteEndPoint);
MessageBox.Show("Connection established. Please select a file to send.");
}
catch (SocketException ex)
{
MessageBox.Show(ex.ErrorCode.ToString() + "-" + ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnXBrowse_Click(object sender, EventArgs e)
{
if (socketClient != null)
{
openFileDialog1.ShowDialog();
}
else
{
MessageBox.Show("Please connect to the server first");
}
}
private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
txtXFile.Text = openFileDialog1.FileName;
}
private void btnXTransfer_Click(object sender, EventArgs e)
{
//Check if the socket is connected to the remote host
//otherwise prompt user to get connected to the server first
if (socketClient != null && socketClient.Connected)
{
//If any file is selected then only proceed with transfer
if (!openFileDialog1.FileName.Equals(string.Empty))
{
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
try
{
//Get the filename
string filename = Path.GetFileName(openFileDialog1.FileName);
//Covert the file name in form of byte
byte[] fileNameByte = Encoding.ASCII.GetBytes(filename);
//4- to store the filename length(as int - 4bytes)
//8- to stote the file content length(as long take 8 bytes)
int totalLength = 4 + fileNameByte.Length + 8;
//Clientdata[] reprents the data to sent to the server
//which represent the file details
byte[] clientData = new byte[totalLength];
byte[] fileNameLength = BitConverter.GetBytes(fileNameByte.Length);
byte[] fileContentLength = BitConverter.GetBytes(fs.Length);
//Copy all the data ClientData array
fileNameLength.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileContentLength.CopyTo(clientData, 4 + fileNameByte.Length);
//Send the data to server
socketClient.Send(clientData);
int byteRead = 0;
int bytesToRead = (int)fs.Length;
while (bytesToRead > 0)
{
byte[] data = new Byte[1500];
byteRead = bytesToRead > 1500 ? 1500 : bytesToRead;
int n = fs.Read(data, 0, byteRead);
//Send the data to server
socketClient.Send(data);
bytesToRead -= n;
}
//Code block to get the success message from server
byte[] successmessage = new byte[4];
int msg = socketClient.Receive(successmessage);
if (Encoding.ASCII.GetString(successmessage).Equals("Done"))
{
MessageBox.Show("transfered the file successfully");
txtXFile.Text = string.Empty;
openFileDialog1.FileName = string.Empty;
}
}
catch (SocketException ex)
{
MessageBox.Show(ex.ErrorCode + "-" + ex.Message);
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
fs.Close();
if (socketClient != null && socketClient.Connected)
{
socketClient.Shutdown(SocketShutdown.Both);
socketClient.Close(); ;
}
}
}
else
{
MessageBox.Show("Please select afile to transfer.");
}
}
else
{
MessageBox.Show("Please connect to the host.");
}
}
}
- eine neugierige Frage, warum Sie das bind-socket-client zu bestimmten port??
- Wie pro meine Projekt-Anforderung der client-socket-Programm installiert sein wird, in verschiedenen Krankenhäusern. Es ist die Tabelle in der DB, welche Karten die Krankenhaus-ids mit bestimmten port. Also, wenn ich die Daten vom client, prüfe ich den port der eingegangenen Anfrage und Sie bekommen, um zu wissen, von welchem Krankenhaus ich bin immer die Daten.
- geben Sie diesem einen Versuch für Testzwecke IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0); socketClient.Bind(endPoint);
- Ich denke, durch Angabe der port 0 ist, wird der client zufälligen port zu kommunizieren. Aber ich brauche den client für die Kommunikation über bestimmten port.
- Für Referenz, herauszufinden, die Identität des Clients durch welchen port es sendet aus, ist wohl einer der hässlicher Weise habe ich Dinge gesehen, getan. Wenn es keine NATting oder proxying etc. geht, bist du aufgeschmissen. Es wäre viel, viel, viel besser, wenn Sie senden konnte einige ID/auth-info, die über die Verbindung anstatt zu beten, der client ist nicht bösartig.
- UPS Tippfehler, ich meinte, IPEndPoint endPoint = new IPEndPoint(IPAddress.Jeder, 9030);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Sie müssen nicht binden Sie das lokale Ende der client-Steckdose-Rahmen und/oder OS gebunden wird, um einen temporären port automatisch. In der Tat, wenn Sie binden Sie den socket an 127.0.0.1, vorausgesetzt, Anschluss nicht eine Ausnahme werfen über unreachable hosts, eines von zwei Dingen passieren wird (ich bin mir nicht sicher, welche):
So oder so, die Pakete verloren gehen in einer der Maschinen, loopback-interfaces und der client wird nie eine Antwort.
Wenn Sie müssen binden in der client, wählen Sie Ihre echte IP-Adresse, oder verwenden Sie
IPAddress.Any
etwa so:Werde, dass eine Bindung an einen port gegeben, aber immer noch lassen den OS wählen Sie die IP-Adresse. Aber 127.0.0.1 wahrscheinlich nicht funktionieren.