#c# #sockets
#c# #сокеты
Вопрос:
Я новичок в программировании сокетов, поэтому у меня есть вопрос. Я пытаюсь создать два приложения, сервер и клиент, которые должны отправлять и получать файлы друг от друга через Интернет (как отправлять, так и получать файлы). Будет только один сервер и только один клиент, поэтому я решил, что мне не нужно асинхронное соединение с сокетами. Я пытался отправлять и получать файлы только через одно сокет-соединение, но это не сработало. Теперь я пытаюсь использовать два сокета, работающих в разных потоках, используя один и тот же IP и разные порты, но это снова не работает. Должен ли я находить проблему в своем источнике или мне придется использовать асинхронное соединение с сокетами?
Это мое серверное приложение. Код для обоих сокетов довольно похож, разница лишь в используемом мной порту.
// My main thread starts another one, for the receiving of files
public static void StartListening() {
t = new Thread(receiveFile);
t.Start();
sendFile();
}
//
static void sendFile()
{
IPAddress ipAddress = IPAddress.Parse("192.168.1.101");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 10999);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(10);
while (true)
{
handler = listener.Accept();
//code after connecting for sending files
while(true) {
//...
}
}
}
catch(Exception e) {}
}
static void receiveFile()
{
IPAddress ipAddress = IPAddress.Parse("192.168.1.101");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(10);
while(true) {
handler = listener.Accept();
//code after connecting for receiving files
while(true) {
//...
}
}
}
catch(Exception e) {}
}
И это код в моем клиентском приложении для подключения к сокетам.
Опять же, единственное различие заключается в сокетах:
//Again i start a second thread, for the second socket
public static void StartClient() {
t = new Thread(receiveFile);
t.Start();
sendFile();
}
static void sendFile()
{
try
{
IPAddress ipAddress = IPAddress.Parse("95.110.62.74");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sender.Connect(remoteEP);
//Code for sending to the server after connecting
while (true) { }
}
catch(Exception e) {}
}
catch(Exception e) { }
}
static void receiveFile()
{
try
{
IPAddress ipAddress = IPAddress.Parse("95.110.62.74");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 10999);
sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sender.Connect(remoteEP);
//Code for sending to the server after connecting
while (true) { }
}
catch(Exception e) {}
}
catch(Exception e) { }
}
Я использую разные IP-адреса в своем серверном и клиентском приложении, потому что мой сервер находится за маршрутизатором, и я сказал маршрутизатору перенаправить соединение на оба potr. Когда я запускаю обе программы, они подключаются только через один из сокетов, каждый раз по-разному, я имею в виду, что иногда они подключаются к одному на порту 10999, иногда к другому, но никогда к обоим.
Я не уверен, все ли я ясно объяснил 🙂
Заранее спасибо
Комментарии:
1. Что вы подразумеваете под «не работает»? Какие ошибки вы получаете?
2. Я думаю, что для ваших целей синхронные сокеты должны работать нормально.
3. Пожалуйста, предоставьте нам полные шаги воспроизведения, немного информации о том, где запущены программы (оба на локальном хосте, два разных компьютера в одной сети, разные сети), все ошибки, все трассировки стека исключений, некоторый код и т. Д. Просто сказать «Я создал программу, и она не сработала» не дает нам абсолютно никаких намеков на то, в чем заключается реальная проблема. Пожалуйста, отредактируйте свой вопрос, чтобы предоставить эту деталь. Сказав это, я бы поспорил, что вы были заблокированы брандмауэром Windows или брандмауэром вашего маршрутизатора. Или, может быть, вам нужно запускать программы от имени администратора…
4. Не могли бы вы предоставить журнал (просмотреть его) того, что отправляется / принимается? Возможно, маршрутизатор не позволяет вам отправлять файл, или требуется какой-то прокси или аутентификация. Пожалуйста, дайте нам журнал, чтобы взглянуть на него 🙂