可不可以在一个Socket中先发发送数据,然后再读取数据?
程序如下:
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
System.Net.Sockets.Socket skServer;
skServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skServer.Connect("127.0.0.1", 9002);
SendReceiveTest1(skServer);
Console.ReadKey(false);
} public static int SendReceiveTest1(Socket server)
{
byte[] msg = Encoding.UTF8.GetBytes("This is a test");
byte[] bytes = new byte[256];
try
{
// Blocks until send returns.
int i = server.Send(msg);
Console.WriteLine("Sent {0} bytes.", i); // Get reply from the server.
i = server.Receive(bytes);
Console.WriteLine(Encoding.UTF8.GetString(bytes));
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
return (e.ErrorCode);
}
return 0;
} }
}其中SendReceiveTest1是MSDN的中示例代码。
但是在skServer.Connect("127.0.0.1", 9002);处出错,
提示:由于目标机器积极拒绝,无法连接。Error Code:10061
将端口号改为80就可以了。但是下面在i = server.Receive(bytes);处又出错,
提示:远程主机强迫关闭了一个现有的连接。Error Code:10054
可是这是MSDN的示例啊,难道错了?求解这两个错误。
再问可不可以在一个Socket中先发发送数据,然后再读取数据?
最后如何改正确上面的程序?
程序如下:
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
System.Net.Sockets.Socket skServer;
skServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skServer.Connect("127.0.0.1", 9002);
SendReceiveTest1(skServer);
Console.ReadKey(false);
} public static int SendReceiveTest1(Socket server)
{
byte[] msg = Encoding.UTF8.GetBytes("This is a test");
byte[] bytes = new byte[256];
try
{
// Blocks until send returns.
int i = server.Send(msg);
Console.WriteLine("Sent {0} bytes.", i); // Get reply from the server.
i = server.Receive(bytes);
Console.WriteLine(Encoding.UTF8.GetString(bytes));
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
return (e.ErrorCode);
}
return 0;
} }
}其中SendReceiveTest1是MSDN的中示例代码。
但是在skServer.Connect("127.0.0.1", 9002);处出错,
提示:由于目标机器积极拒绝,无法连接。Error Code:10061
将端口号改为80就可以了。但是下面在i = server.Receive(bytes);处又出错,
提示:远程主机强迫关闭了一个现有的连接。Error Code:10054
可是这是MSDN的示例啊,难道错了?求解这两个错误。
再问可不可以在一个Socket中先发发送数据,然后再读取数据?
最后如何改正确上面的程序?
提示:由于目标机器积极拒绝,无法连接。Error Code:10061
机器的9002端口是否在监听?
将端口号改为80就可以了。
这是因为缺省的80端口处在监听状态
但是下面在i = server.Receive(bytes);处又出错,
提示:远程主机强迫关闭了一个现有的连接。Error Code:10054
这句是接收从服务器返回的信息,但是80端口没有写程序返回数据,当然出错了可是这是MSDN的示例啊,难道错了?
还有一段呢?为说明你只运行一段,收发是两个程序的,好好看看MSDN
2。可以
3。在发送结束后,最好skServer.Shutdown(SocketShutdown.Both);
int i = server.Send(msg); 这句不是发送吗?
to:Koala_sea ;谢谢,不过这个例子就是先发送后接收的程序啊。
真的可以吗?我反复试了很久。还是没有办法。Shutdown这个好像没什么影响这个是我修改后的程序,没有问题了。
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
try
{
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),5000);
Socket skServer,skClient; //服务端侦听Socket,客户端发送Socket
skServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skServer.Bind(ipPoint);
skServer.Listen(5);
skClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skClient.Connect(ipPoint);
Socket skReceive = skServer.Accept(); //侦听Socket的接收Socket
SendTest(skClient);
ReceiveTest(skReceive);
SendTest(skClient);
ReceiveTest(skReceive);
SendTest(skClient);
ReceiveTest(skReceive);
}
catch (SocketException ex) { Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode); }
Console.ReadKey(false);
} public static void SendTest(Socket skExec)
{
byte[] msg = Encoding.Default.GetBytes("Send a testdata!");
try
{
int i = skExec.Send(msg);
Console.WriteLine("Sent {0} bytes:Send a testdata!", i);
}
catch (SocketException ex)
{
Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode);
}
}
static void ReceiveTest(Socket skExec)
{
byte[] bytes = new byte[256];
try
{
int i = skExec.Receive(bytes);
Console.WriteLine("Receive data:" + Encoding.Default.GetString(bytes));
}
catch (SocketException ex)
{
Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode);
}
}
static public int SendReceiveTest1(Socket server)
{
byte[] msg = Encoding.UTF8.GetBytes("This is a test");
byte[] bytes = new byte[256];
try
{
// Blocks until send returns.
int i = server.Send(msg);
Console.WriteLine("Sent {0} bytes.", i); // Get reply from the server.
i = server.Receive(bytes);
Console.WriteLine(Encoding.UTF8.GetString(bytes));
}
catch (SocketException e)
{
Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
return (e.ErrorCode);
}
return 0;
} }
}我发现还是没有办法在一个Socket实例中接收自己发送的数据。只能用两个Socket,共用一个IP:端口
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),9002);
Socket skServer,skClient; //服务端侦听Socket,客户端发送Socket
skServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skServer.Bind(ipPoint);
skServer.Listen(5);
代码,再尝试连接就可能连上了,发送数据,接收数据我不写了