我对使用C#的套接字编程完全不熟悉,我正试图让两个正在运行的.exes与彼此交谈:
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)总是为真)。
请帮助,谢谢。
答案 0 :(得分:2)
编辑:注意到您的侦听器中没有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;
}
答案 1 :(得分:1)
您的服务器代码中没有接受传入连接的位置。您必须在服务器端accept and create a socket为新的传入客户端。
Socket newSock = sock.Accept();
if (!newSock.Connected) continue;
else
{...}