C # сокеты помогают - PullRequest
       4

C # сокеты помогают

1 голос
/ 07 сентября 2010

Я совершенно новичок в программировании сокетов на 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) всегда верно).

Пожалуйста, помогите, спасибо.

Ответы [ 2 ]

2 голосов
/ 07 сентября 2010

Редактировать : заметил, что у вас нет 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 голос
/ 07 сентября 2010

Нет, где в коде вашего сервера вы принимаете входящие соединения.Вам нужно будет принять и создать сокет на стороне сервера для новых входящих клиентов.

Socket newSock = sock.Accept();
if (!newSock.Connected) continue;
else
{...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...