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

21.06.2009, 12:41
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
Помогите разобратся с сокет сервером на С++
Всем привет !
Написал сокет сервер на с++ незнаю правельно или нет - но так работает и запросы принемает , проблема в том что я не как не могу ответить клиенту через функцию send() ,
Код:
int main ( )
{
int sockfd,client;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
socklen_t n;
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(5190);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != -1){
cout << "SERVER - STARTED !!!" <<"\n";
while(1) {
if(!listen(sockfd, 5)){
n = sizeof(addr);
if((client = accept(sockfd, (struct sockaddr *) &addr, &n)) != -1){
cout << "Coonect-" <<inet_ntoa(addr.sin_addr) <<"\n";
char c;
bool finished;
char buffer[1024];
finished = read(client, &c, 10);
cout << client << "---" << c <<"\n";
// вот сдесь и проблема не могу ответить клиенту !
int hel;
hel = "9999\0";
send (client, hel, strlen(hel), 0);
close(client);
}
}
}
}
else{cout << "NO SERVER" << "\n";}
}
|
|
|

21.06.2009, 14:08
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
Во первых listen() запускается только один раз, во вторых внимательно пересмотри этот участок кода
Код:
char c;
bool finished;
char buffer[1024];
finished = read(client, &c, 10);
cout << client << "---" << c <<"\n";
// вот сдесь и проблема не могу ответить клиенту !
int hel;
hel = "9999\0";
send (client, hel, strlen(hel), 0);
close(client);
Внимательно прочитай документацию по сетевым ф-циям!
|
|
|

21.06.2009, 14:32
|
|
Познающий
Регистрация: 04.01.2009
Сообщений: 94
Провел на форуме: 404716
Репутация:
145
|
|
стоит попробовать объявить переменную hel как char
|
|
|

21.06.2009, 14:39
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
close -> closesocket
read -> recv
hel - у тя int сделать хотябы char hel[размер]
strlen - тока для строк работает
у тебя наверное при компиле сотни варнингов на экран вылетают
|
|
|

21.06.2009, 20:52
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
Вобщем разобрался с отправкой ответа , скрипт немного переделал
Код:
int main ( )
{
int sockfd,client;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
socklen_t size;
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind()
if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
cout << "Error - bind() !" << "\n";
return 0;
}
// listen()
if(listen(sockfd, 5) != 0){
cout << "Error - listen() !" << "\n";
return 0;
}
while(1) {
size = sizeof(addr);
client = accept(sockfd, (struct sockaddr *) &addr, &size);
if(client > 0){
cout << "Coonect-" <<inet_ntoa(addr.sin_addr) <<"\n";
// - пришли данные
char buffer[1024];
bzero(buffer,sizeof(buffer));
recv(client, buffer, sizeof(buffer),0);
cout << buffer << "\n";
//- ответ клиенту
char *reply = "ggg";
send(client, reply, strlen(reply)+1, 0);
}
}
}
Получается к серверу конектятся клиенты и обмениваются данными - конект поддерживается постоянно с клиентом - и вот проблема как определить на стороне сервера что клиент
отключился - разорвал соеденение ?
|
|
|

22.06.2009, 22:50
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
Или подскажите куда капать - по поваду (как определить на стороне сервера что клиент отключился - разорвал соеденение ?)
|
|
|

22.06.2009, 22:57
|
|
Познающий
Регистрация: 04.01.2009
Сообщений: 94
Провел на форуме: 404716
Репутация:
145
|
|
Попробуй использовать WSAEventSelect
это события
|
|
|

23.06.2009, 17:52
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
Сообщение от --StraNger--
Попробуй использовать WSAEventSelect
это события
Да что-то не получается с этим - на perl это все решается очень просто - на c++ еще не найду сдравого решения !
|
|
|

30.06.2009, 12:10
|
|
Участник форума
Регистрация: 04.02.2009
Сообщений: 132
Провел на форуме: 350627
Репутация:
1
|
|
Вобщем написал сокет сервер - все работает только выдает 2 warning: при компиляции , я не могу их устранить
вот полный код сервера
Код:
#include <iostream.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <time.h>
#include <arpa/inet.h>
#define PORT 5190
#define SERVER_IP "000.000.00.000"
void NewClient (int client){
while(1){
char buffer[1024];
bzero(buffer,sizeof(buffer));
if(recv(client, buffer, sizeof(buffer),0) != 0){
cout << buffer "\n";
}
}
}
int main ( )
{
int sockfd,client;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
socklen_t size;
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// bind()
if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
cout << "Error - bind() !" << "\n";
return 0;
}
// listen()
if(listen(sockfd, 5) != 0){
cout << "Error - listen() !" << "\n";
return 0;
}
while(1) {
size = sizeof(addr);
client = accept(sockfd, (struct sockaddr *) &addr, &size);
if(client > 0){
cout << "Coonect-" <<inet_ntoa(addr.sin_addr) <<"\n";
char buffer[1024];
bzero(buffer,sizeof(buffer));
recv(client, buffer, sizeof(buffer),0);
if(buffer == "<policy-file-request/>"){
char *mes = "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
send(client, mes, strlen(mes)+1, 0);
close(client);
return 1;
}
if(!fork()){
NewClient(client);
}
}
}
}
а вот предупреждение при компиляции
In file included from /usr/include/c++/4.2/backward/iostream.h:31,
from server.cpp:1:
/usr/include/c++/4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
server.cpp: In function 'int main()':
server.cpp:107: warning: deprecated conversion from string constant to 'char*'
по <iostream.h> пытался так <iostream>
тогда вобще ошибок море все на cout указывают .
а 'char*' тоже незнаю как устранить !
Подскажите пожалуйста !
|
|
|

30.06.2009, 14:29
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
При использовании <iostream> все обьекты библиотеки находятся в пространстве std, для этого необходимо либо в начале написать using namespace std; либо явно указывать пространство имен, например так std::cout
Далее эту запись замени
Код:
char *mes = "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
на вот эту
Код:
char mes[] = "<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
П.С. в следующий раз пиши конкретно в какой строке ошибки/предупреждения, а то тут у тебя написано в 107, а кода меньше чем на 100 строк.
Последний раз редактировалось razb; 30.06.2009 в 14:37..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|