C#从套接字接收数据并将其放入字符串中?

C#从套接字接收数据并将其放入字符串中?,c#,sockets,C#,Sockets,我有一个套接字服务器,正在尝试从客户端接收字符串 客户是完美的,当我使用这个 Socket s = myList.AcceptSocket(); Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); byte[] b = new byte[100]; int k = s.Receive(b); Console.WriteLine(k); Console.WriteLine("Recieved..."); for (

我有一个套接字服务器,正在尝试从客户端接收字符串

客户是完美的,当我使用这个

Socket s = myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);

byte[] b = new byte[100];
int k = s.Receive(b);
Console.WriteLine(k);
Console.WriteLine("Recieved...");
for (int i = 0; i < k; i++) {
    Console.Write(Convert.ToChar(b[i]));
    ASCIIEncoding asen = new ASCIIEncoding();
    s.Send(asen.GetBytes("The string was recieved by the server."));
}
错误:

名称i不在当前上下文中。 这是我收到的唯一错误信息


假设
s
是调用receive的
Socket
对象,则返回一个
byte[]
。要将其转换回字符串,请使用适当的编码,例如

string szReceived = Encoding.ASCII.GetString(b);
编辑:由于缓冲区
b
始终为100字节,但实际接收的字节数随每个连接的不同而不同,因此应使用
Socket.Receive()调用的返回值来仅转换实际接收的字节数

byte[] b = new byte[100];
int k = s.Receive(b);
string szReceived = Encoding.ASCII.GetString(b,0,k); 
初始化套接字

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAdd = System.Net.IPAddress.Parse(m_ip);
IPEndPoint remoteEP = new IPEndPoint(ipAdd, m_port);
连接插座

socket.Connect(remoteEP);
从插座接收

byte[] buffer = new byte[1024];
int iRx = socket.Receive(buffer);
char[] chars = new char[iRx];

System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
System.String recv = new System.String(chars);
发送消息

byte[] byData = System.Text.Encoding.ASCII.GetBytes("Message");
socket.Send(byData);
闭合插座

socket.Disconnect(false);
socket.Close();

这样无需设置缓冲区大小,适合响应:

public static byte[] ReceiveAll(this Socket socket)
    {
        var buffer = new List<byte>();

        while (socket.Available > 0)
        {
            var currByte = new Byte[1];
            var byteCounter = socket.Receive(currByte, currByte.Length, SocketFlags.None);

            if (byteCounter.Equals(1))
            {
                buffer.Add(currByte[0]);
            }
        }

        return buffer.ToArray();
    }
公共静态字节[]ReceiveAll(此套接字)
{
var buffer=新列表();
而(socket.Available>0)
{
var currByte=新字节[1];
var byteCounter=socket.Receive(currByte,currByte.Length,SocketFlags.None);
if(字节计数器等于(1))
{
buffer.Add(currByte[0]);
}
}
返回buffer.ToArray();
}

请增强您的代码示例,并显示b和s的定义。接下来,您肯定没有得到您正在描述的错误,因为它显然有打字错误。请发布一个副本粘贴版本的异常加上调用堆栈,而不是一个复述写上去。我怀疑你犯了这篇文章中描述的错误:好吧,我稍微更新了我的代码部分。我会检查链接:)@Christoph我检查了你的链接,但没有多少帮助或通知我。我必须说我不经常用C语言编程,你不能只说
Convert.ToChar(b[I])
,然后期望它返回一个字符串,其中变量
I
循环通过
b
-数组的所有字节。明确地在
for
语句中创建循环变量
i
,否则该变量将不存在<代码>字符串操作=”;对于(inti=0;i
将适当地填充
操作
变量。“名称i不在当前上下文中”-那么您就不会显示实际代码。在for()后面有分号吗?它能工作一半谢谢!:)但现在,当我在控制台中编写它时,它显示正确。。。。但是我的开关箱坏了。。无事发生:o控制台写入线(szReceived);Console.WriteLine(“接收…”);开关(szReceived){case“ping”:Console.WriteLine(“ping-wird-ausgeführt!”);break;case“somethingelse”:break;}我的第一个直觉是,应该按照接收到的字节数切断数组
Socket.Receive()
有一个返回值,您需要该值在实际接收的字节处切掉数组。使用这个:
intk=s.Receive(b);string szReceived=Encoding.ASCII.GetString(b.Take(k.ToArray())
那么字符串的构造应该是完美的。(您需要一个
使用System.Linq;
,或者使用第二个重载
string szReceived=Encoding.ASCII.GetString(b,0,k);
)您做到了D谢谢大家。
public static byte[] ReceiveAll(this Socket socket)
    {
        var buffer = new List<byte>();

        while (socket.Available > 0)
        {
            var currByte = new Byte[1];
            var byteCounter = socket.Receive(currByte, currByte.Length, SocketFlags.None);

            if (byteCounter.Equals(1))
            {
                buffer.Add(currByte[0]);
            }
        }

        return buffer.ToArray();
    }