Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

08.05.2009, 10:00
|
|
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме: 812087
Репутация:
129
|
|
С# и сокеты
Пишу программку,ее основой является мини подобие http сервера,проблема заключается в следующем,когда из студии я компилирую проект,запускает сервер и я могу обратиться к нему браузером и сервер вернет браузере ответ,который соответственно я увижу в окне браузера... но если я не перезапуская свой сервер попрошу отдать в браузер другую страничку,то браузер пишет,что не может соединиться с сервером  ... помогите пожалуйста решить проблему,заранее очень сильно благодарен.
ЗЫ Сильно ногами за код не пинать,только учусь
PHP код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace http_agent
{
class http_serv
{
private const int MAX_BUFFER = 4096;
private const string notfound = "HTTP/1.1 404 File not found\n\n";
private const string header_send = "HTTP/1.1 200 OK\nServer: tinyHttp\nConnection: close\nContent-Type: text/html\n\n";
Socket listenfd = null;
IPEndPoint pe = null;
public int initHTTPServ()
{
//if(listenfd.) listenfd.Close(); -- проверить существует ли сокет,если да то закрыть его...
listenfd = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
pe = new IPEndPoint(IPAddress.Any, 8080);
listenfd.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,false);
listenfd.Bind(pe);
listenfd.Listen(1);
System.Console.WriteLine("HTTP Server start ...");
return 0;
}
public void checkHttpServer()
{
//Подключаемся к сокету и вызываем функцию обслуживания запроса
handleConnection(listenfd.Accept());
}
public string getFileName(string inbuf, int start)
{
int i = start, j = 0;
string ret = "";
char[] outs = new char[80 + 1];
while (inbuf[i] == ' ') i++;
for (; i < inbuf.Length; i++)
{
if (inbuf[i] == ' ')
{
break;
}
outs[j++] = inbuf[i];
}
ret = new string(outs,0,j);
if (ret == "/")
{
ret = "/index.html";
}
return ret;
}
public void emitHTTPResponseHeader(Socket connfd)
{
connfd.Send(Encoding.ASCII.GetBytes(header_send));
}
public void handleConnection(Socket connfd)
{
Console.WriteLine("Handle Connections...");
int len, max, loop;
byte[] buffer = new byte[http_serv.MAX_BUFFER+1];
string filename = "";
string str_in_sock = "";
max = 0; loop = 1;
while (loop == 1)
{
len = connfd.Receive(buffer);
buffer[max+len] = 0;
if (len <= 0) return;
max += len;
if ((buffer[max-4] == 0x0d) && (buffer[max-3] == 0x0a) && (buffer[max-2] == 0x0d) && (buffer[max-1] == 0x0a)) loop = 0;
}
str_in_sock = Encoding.ASCII.GetString(buffer, 0, max);
if (str_in_sock.Substring(0, 3) == "GET") //если метод GET
{
filename = getFileName(str_in_sock, 4); //получаем имя запрашиваемого файла файла
if (filename == "/index.html") { Console.WriteLine("GET /index.html");}//emitNews( connfd );
else if (filename == "/config.html") { Console.WriteLine("GET /config.html");} //emitConfig( connfd );
else if (filename == "/art") { Console.WriteLine("GET /art"); } //emitArticle( connfd, filename );
else
{
connfd.Send(Encoding.ASCII.GetBytes(notfound));
connfd.Close();
Console.WriteLine("GET Not Found");
}
}else if (str_in_sock.Substring(0, 4) == "POST") //Если метод POST
{
filename = getFileName(str_in_sock, 4);
if (filename == "/clear")
{
//clearEntries();
emitHTTPResponseHeader(connfd);
buffer = Encoding.ASCII.GetBytes("<P><H1>Нажмите назад и перезагрузите страницу</H1><P>\n\n");
connfd.Send(buffer);
} else
{
connfd.Send(Encoding.ASCII.GetBytes(notfound));
connfd.Close();
}
}
else
{
connfd.Send(Encoding.ASCII.GetBytes("HTTP/1.1 501 Not Implemented\n\n"));
}
}
}
class Program
{
static void Main(string[] args)
{
http_serv serv = new http_serv();
serv.initHTTPServ();
serv.checkHttpServer();
System.Console.ReadLine();
}
}
}
|
|
|

08.05.2009, 10:36
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Не удивительно, ведь ты же обрабатываешь только один запрос пользователя, после чего программа просто заканчивает выполнение...
Нужно handleConnection(listenfd.Accept()); хотя бы в цикле выполнять. А лучше асинхронно или с потоками...
|
|
|

08.05.2009, 14:55
|
|
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме: 812087
Репутация:
129
|
|
Спасибо огромное,во я дурак то 
|
|
|

24.05.2009, 23:00
|
|
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме: 812087
Репутация:
129
|
|
Подниму небольшой вопросик про сокеты опять  ... Можно пинать меня сильно , но главное что бы было за что :-D... есть вот такой код
PHP код:
nntp_he = Dns.GetHostEntry(nntpServer);
foreach(IPAddress tmp_ip_serv in nntp_he.AddressList)
{
ip_nntp_serv = tmp_ip_serv;
}
nntp_conn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
nntp_ep = new IPEndPoint(ip_nntp_serv, 119);
Console.WriteLine("Соединяемся с " + nntpServer);
nntp_conn.Connect(nntp_ep);
buffer = new byte[gVarible.MAX_LINE + 1];
nntp_conn.Receive(buffer);
Console.WriteLine(Encoding.ASCII.GetString(buffer));
buffer = null;
nntp_conn.Send(Encoding.ASCII.GetBytes("c"));
Console.WriteLine("q");
byte[] buffer2 = new byte[1024];
Console.WriteLine("q2");
nntp_conn.Receive(buffer2);
Console.WriteLine("q3");
Console.WriteLine(Encoding.ASCII.GetString(buffer2));
Проблема в том что он всего лишь один раз принимает данные из сокета ,после соединения,а когда я отправляю серверу через открытый с ним сокет данные ,а затем пытаюсь прочитать....
nntp_conn.Receive(buffer2);
Console.WriteLine("q3");
Console.WriteLine(Encoding.ASCII.GetString(buffer2 ));
Вот эта часть кода вообще не выполняется,доходит только до Console.WriteLine("q2"); и все,буду безумно благодарен и поставлю плюсики от всей души,если поможите разобраться с этой проблемкой.Заранее спасибо!
|
|
|

24.05.2009, 23:31
|
|
Познающий
Регистрация: 02.08.2008
Сообщений: 55
Провел на форуме: 363117
Репутация:
30
|
|
Может полный исходник кинь. Чтоб и сервер и клиент было видно.
Последний раз редактировалось Juda; 24.05.2009 в 23:38..
|
|
|

24.05.2009, 23:43
|
|
Познающий
Регистрация: 02.08.2008
Сообщений: 55
Провел на форуме: 363117
Репутация:
30
|
|
вот исходник чата на C#. Посмотри че да как. http://sourceforge.net/project/downloading.php?group_id=71539&filename=SharpChat-1.1.1.zip&a=95975655
|
|
|

25.05.2009, 07:17
|
|
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме: 812087
Репутация:
129
|
|
Это и был клиент,а в роли сервера выступает сервер nntp новостей,к которому я тут соответственно и подключаюсь
|
|
|

25.05.2009, 17:15
|
|
Познающий
Регистрация: 02.08.2008
Сообщений: 55
Провел на форуме: 363117
Репутация:
30
|
|
Чувак, у тебя есть исходник, комп, мозг, дебагер и еще есть MSDN, в котором куча примеров по сокетам. Пройдись дебагером по коду (не по мозгам  ), посмотри че не работает. Смысл два дня ждать ответа на форуме, если самому можно за часик все склепать. 
|
|
|

25.05.2009, 19:01
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от [NiGHT]DarkAngel
Вот эта часть кода вообще не выполняется,доходит только до Console.WriteLine("q2"); и все
Что "и все"? Выпадает ошибка? Какая?
Поставь try, отлови ошибку.
|
|
|

25.05.2009, 21:38
|
|
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме: 812087
Репутация:
129
|
|
Вот именно что ошибки никакой нет  ,просто не выполняется дальше код ... не один из трех исключения для сокета через catch не выпадает ... возьму совет Juda пойду дебаггером и снифером 
|
|
|
|
 |
|
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Delphi сокеты
|
Flame of Soul |
С/С++, C#, Delphi, .NET, Asm |
2 |
22.04.2009 04:56 |
|
Сокеты and max_execution_error
|
Велемир |
PHP, PERL, MySQL, JavaScript |
8 |
02.02.2009 17:52 |
|
Отправляем хтмл-письмо через сокеты
|
je0n |
Статьи |
4 |
07.02.2007 15:23 |
|
[Delphi] Закачка файлов через сокеты
|
Navern |
С/С++, C#, Delphi, .NET, Asm |
3 |
04.02.2007 16:13 |
|
В общем делаю запрос в сокеты! и Не чего не возвращает!
|
AIN |
С/С++, C#, Delphi, .NET, Asm |
19 |
07.08.2005 17:27 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|