C#Winform使用IP

时间:2015-06-08 18:23:39

标签: c# winforms sockets

我需要创建一个应用程序,允许用户通过wifi连接到设备(一块将被发送参数/命令的硬件)(wifi是最终目标,但我现在正在解决任何连接)和然后向所述设备发送命令。我知道一些C#和一些套接字/ IP的东西,但不知道使用C#的套接字/ IP。程序的可视化,GUI方面不是我正在努力的方面。我似乎无法启动并运行套接字并建立任何真正的连接。我一直得到“提供的无效参数”例外。

有关此特定问题的任何提示或有关C#networking / sockets / etc的帮助。欢迎。

我通过以下方式声明一个新套接字:

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);
            }
        }
}

1 个答案:

答案 0 :(得分:0)

根据OP的请求,有关使用TcpClient甚至TcpListener的一些信息,以防您需要创建服务器。以下链接将帮助您开始使用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

在该代码(第一个链接)中,您将找到以下语句:stream.Write(data,0,data.Length);
您想多次写入套接字,然后假设您只编写两次相同的数据:

stream.Write(data, 0, data.Length);
stream.Write(data, 0, data.Length);

在接收器上,您必须意识到,因为TCP是流式传输,您可能会收到2封发送消息'在一次接收或分散多次接收。

在代码中你会发现:

stream.Close();         
client.Close();   

结束通信并关闭套接字,不再可能在关闭后发送。

使用套接字,还有tcpclient和tcplistener(因为它们基于套接字),我认为它是一种高级材料。没有真正理解什么是流,什么是IP寻址,什么是TCP,UDP,如何使用套接字,对线程有一些基本的了解。很容易迷路。我是一名专业程序员,在阅读了大量有关它的信息后,我没有触及这些材料。

最好的办法是根据互联网上的示例进行更多调查。图书。并使用此媒介询问非常具体的专门问题。精心设计的问题在没有正确答案的情况下会被关闭,这当然会导致沮丧。