簡體   English   中英

C#套接字幫助

[英]c# sockets help

我是完全不熟悉C#套接字編程的人,我試圖讓兩個正在運行的.exe相互交流:

static void Main(string[] args) {
    bool sender = !false;
    if (args.Length > 0) sender = !true;
    if (sender) {
        try {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8221);
            sock.Connect(ipe);
            while (true) {
                string toSend = Console.ReadLine();
                sock.Send(Encoding.UTF32.GetBytes(toSend));
            }
        }
        catch (SocketException e) {
            Console.WriteLine(e.Message);
            Console.ReadLine();
        }
    }
    else {
        try {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 8221);
            sock.Bind(ipe);
            sock.Listen(4);
            while (true) {
                if (!sock.Connected) continue;
                byte[] buffer = new byte[1024];
                if (sock.Receive(buffer) > 0) Console.WriteLine(Encoding.UTF32.GetString(buffer));
            }
        }
        catch (SocketException e) {
            Console.WriteLine(e.Message);
            Console.ReadLine();
        }
    }
}

目前,這兩個程序都沒有錯誤運行,但是它們似乎沒有連接(如果(!sock.Connected)始終為true)。

請幫忙,謝謝。

編輯 :注意到您在偵聽器中沒有sock.Accept()。 您需要獲得一個可以“交談”的傳入套接字。 將一個Socket c = sock.Accept()放在while(true)循環之前,並使用c套接字發送和接收數據

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 8221);
sock.Bind(ipe);
sock.Listen(4);

Socket c = sock.Accept(); // added

while (true) {
    if (!c.Connected) continue;
    byte[] buffer = new byte[1024];
    if (c.Receive(buffer) > 0) Console.WriteLine(Encoding.UTF32.GetString(buffer));
}

和; 作為建議,每當我制作套接字程序時,通常都會在實際緩沖區之前發送要發送的字節數。 如果您能夠使發送方和偵聽方建立連接,則可能是使它們交換數據的解決方案。

public void send(byte[] buf) {
    socket.Send(BitConverter.GetBytes(buf.Length), SocketFlags.None);
    socket.Send(buf, buf.Length, SocketFlags.None);
}

public byte[] receive() {
    byte[] lengthBytes = new byte[4];
    int read = socket.Receive(lengthBytes);
    // read contains the number of read bytes, so we can check it if we want
    int length = BitConverter.GetInt32(lengthBytes);
    byte[] buf = new byte[length];
    socket.Receive(buf);
    return buf;
}

在服務器代碼中的任何地方,您都不接受傳入的連接。 您將必須在服務器端為新的傳入客戶端接受並創建套接字

Socket newSock = sock.Accept();
if (!newSock.Connected) continue;
else
{...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM