c# Winform使用IP连接设备
本文关键字:连接 接设备 IP 使用 Winform | 更新日期: 2023-09-27 17:54:14
我需要创建一个应用程序,允许用户通过wifi连接到设备(将发送参数/命令的硬件)(wifi是最终目标,但我正在解决任何连接),然后向所述设备发送命令。我知道一些c#和一些套接字/IP的东西,但不是使用c#的套接字/IP。程序的可视化、GUI方面并不是我所纠结的。我似乎不能得到套接字启动和运行,并作出任何真正的连接。我一直得到"提供了无效参数"异常。
关于这个特定问题的任何提示或c#网络/套接字等的帮助。欢迎。
声明一个新的套接字:
Socket sck;
sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
当它尝试处理"sck = new Socket(…);"时抛出异常。
问题代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace InternetConnect
{
public partial class Form1 : Form
{
// Global Variables
int portNumber = 0;
string ipAddress = "";
TcpClient client;
Socket sck;
EndPoint epLocal, epRemote;
// Needs to be defined at some point
// These are just holding a place for now
string extraIP = "127.0.0.1";
string extraPort = "135";
public Form1()
{
InitializeComponent();
try
{
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
}
private void connectButton_Click(object sender, EventArgs e)
{
try
{
epLocal = new IPEndPoint(IPAddress.Parse(ipAddressTextBox.Text), Convert.ToInt32(portNumberTextBox.Text));
MessageBox.Show("Before Bind");
sck.Bind(epLocal);
MessageBox.Show("After Bind");
epRemote = new IPEndPoint(IPAddress.Parse(extraIP), Convert.ToInt32(extraPort));
sck.Connect(epRemote);
MessageBox.Show("After Connect");
byte[] buffer = new byte[1500];
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
connectButton.Text = "Connected";
connectButton.Enabled = false;
sendButton.Enabled = true;
outgoingTextBox.Focus();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
ipAddress = ipAddressTextBox.Text;
// To make sure there are no letters in the IP Address
int errorCounter = Regex.Matches(ipAddress, @"[a-zA-Z]").Count;
if (errorCounter == 0)
{
if (ipAddress != "")
{
// To make sure the port number is entered without letters
if (int.TryParse(portNumberTextBox.Text, out portNumber))
{
WriteToStatusBar("IP Address and Port Number Valid");
}
else
{
MessageBox.Show("Please enter a valid Port Number.");
}
}
else
{
MessageBox.Show("Please enter a valid IP Address.");
}
}
else
{
MessageBox.Show("Please enter a valid IP Address.");
}
#endregion
try
{
client = new TcpClient();
WriteToStatusBar("Connecting...");
client.Connect(ipAddress, portNumber);
WriteToStatusBar("Connected");
outgoingTextBox.Text = "Enter message to be sent to the device...";
client.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
根据OP的请求,一些关于使用TcpClient甚至tcpplistener的信息,以防您也需要创建服务器。下面的链接将帮助您开始使用TcpClient:https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
或这个代码项目涵盖客户端和服务器:http://www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C
在该代码(第一个链接)中,您将发现以下语句:Write(data, 0, data. length);
如果你想多次写入套接字,那么假设你两次写入相同的数据,你可以简单地做:
stream.Write(data, 0, data.Length);
stream.Write(data, 0, data.Length);
在接收端,你必须意识到,因为TCP是流的,你可能在一个接收端接收到2个发送的"消息",或者分散在多个接收端。
在代码的后面你会发现:
stream.Close();
client.Close();
结束通信并关闭套接字,在完成关闭后再发送是不可能的。
使用套接字,以及tcpclient和tcpplistener(因为它们基于套接字),是我认为有点高级的材料。没有真正理解什么是流,什么是IP寻址,什么是TCP, UDP,如何使用套接字,对线程有一些基本的了解。很容易迷路。我是一个专业的程序员,在阅读了相当多的相关信息之后,我没有碰过这些材料。
最好是做更多的调查,基于互联网上的例子& &;书。用这个媒介问一些非常具体的问题。精心设计的问题往往没有适当的答案,这当然会导致挫折。