[英]C#.NET Socket Programming: Connecting to remote computers
我的終端是一台典型的服務器,一個朋友正在使用客戶端連接到我的IP /端口,他始終收到以下異常消息:“連接嘗試失敗,因為連接的用戶在一段時間后未正確響應,或者建立了連接因連接的主機未能響應{MY_IP}:{MY_PORT}“而失敗-您不需要知道我的IP。
但是,客戶端和服務器在環回地址(127.0.0.1)上可以正常工作。 我也沒有任何防火牆,Windows防火牆也沒有激活。
服務器:
static void Main(string[] args)
{
Console.Title = "Socket Server";
Console.WriteLine("Listening for messages...");
Socket serverSock = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress serverIP = IPAddress.Any;
IPEndPoint serverEP = new IPEndPoint(serverIP, 33367);
SocketPermission perm = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "98.112.235.18", 33367);
serverSock.Bind(serverEP);
serverSock.Listen(10);
while (true)
{
Socket connection = serverSock.Accept();
Byte[] serverBuffer = new Byte[8];
String message = String.Empty;
while (connection.Available > 0)
{
int bytes = connection.Receive(
serverBuffer,
serverBuffer.Length,
0);
message += Encoding.UTF8.GetString(
serverBuffer,
0,
bytes);
}
Console.WriteLine(message);
connection.Close();
}
}
客戶:
static void Main(string[] args)
{
// Design the client a bit
Console.Title = "Socket Client";
Console.Write("Enter the IP of the server: ");
IPAddress clientIP = IPAddress.Parse(Console.ReadLine());
String message = String.Empty;
while (true)
{
Console.Write("Enter the message to send: ");
// The messsage to send
message = Console.ReadLine();
IPEndPoint clientEP = new IPEndPoint(clientIP, 33367);
// Setup the socket
Socket clientSock = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
// Attempt to establish a connection to the server
Console.Write("Establishing connection to the server... ");
try
{
clientSock.Connect(clientEP);
// Send the message
clientSock.Send(Encoding.UTF8.GetBytes(message));
clientSock.Shutdown(SocketShutdown.Both);
clientSock.Close();
Console.Write("Message sent successfully.\n\n");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
while (connection.Available > 0)
{
int bytes = connection.Receive(
serverBuffer,
serverBuffer.Length,
0);
message += Encoding.UTF8.GetString(
serverBuffer,
0,
bytes);
}
我不知道原因(可能是時間問題),但是可用連接數始終為0。因此,服務器未收到客戶端發送的消息。 刪除while循環,您的程序將正常運行。 我嘗試了,它奏效了。
看起來這是帶有某些防火牆的客戶端錯誤。
您需要添加權限以允許套接字使用Assert()方法在特定端點進行連接。以下服務器代碼可能有效,
static void Main(string[] args)
{
Console.Title = "Socket Server";
Console.WriteLine("Listening for messages...");
Socket serverSock = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress serverIP = IPAddress.Any;
IPEndPoint serverEP = new IPEndPoint(serverIP, 33367);
SocketPermission perm = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "98.112.235.18", 33367);
perm.Assert();
serverSock.Bind(serverEP);
serverSock.Listen(10);
while (true)
{
Socket connection = serverSock.Accept();
Byte[] serverBuffer = new Byte[8];
String message = String.Empty;
while (connection.Available > 0)
{
int bytes = connection.Receive(
serverBuffer,
serverBuffer.Length,
0);
message += Encoding.UTF8.GetString(
serverBuffer,
0,
bytes);
}
Console.WriteLine(message);
connection.Close();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.