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

24.07.2007, 23:28
|
|
Познающий
Регистрация: 26.07.2005
Сообщений: 54
Провел на форуме: 47901
Репутация:
46
|
|
При компоновке программы с подключением модулей скомпилированных с-компилятором надо дабавлять extern "C", поскольку с++-компилятор, используя имя функции данное человеком, генерирует своё уникальное имя. Линковщик компонуя объектные файлы (библиотеки, dll-ки ...), полученные разными компиляторами просто не обнаружит необходимой функции. Такая ситуация может возникнуть при использовании сторонних библиотек, dll, объектных файлов. А какже при использовании в своем проекте файлов с разными расширениями *.c или *.cpp, поскольку компилятор обращает внимание на раширение файла.
|
|
|

25.07.2007, 22:17
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
sys64, использовать функции WinApi, документации хватает.
|
|
|

01.08.2007, 14:40
|
|
Banned
Регистрация: 16.12.2006
Сообщений: 27
Провел на форуме: 110871
Репутация:
-17
|
|
qwerty qwerty qwerty
проверка =)
|
|
|

01.08.2007, 14:51
|
|
Banned
Регистрация: 16.12.2006
Сообщений: 27
Провел на форуме: 110871
Репутация:
-17
|
|
переполз с дельфи на си...
в качестве первого проекта выбрал "remot acces system" =)
интересно ваше мнение, что можно зделать лучше? как будет быстрее? как будет грамотней с точки зрения си программиста? и пожалуйста почему?(обязательно)
+ предложившему что-то дельное.
Код:
//main module
#include "NetFunc.h"
#include <windows.h>
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text, EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:WinMain")
int StartSession(SOCKET,SOCKADDR_IN);
void ErrorFunc(int Fr)
{
MessageBox(0,"1111","1111",1);
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
char chA=0;
int iReset=0;
int iOff=0;
while(!iOff)//Main loop
{
WSADATA sWsaData;
SOCKET hLSock;
long host=INADDR_ANY;
short port=6677;
if(WSAStartup(MAKEWORD(2,0),&sWsaData)!=SOCKET_ERROR)
{
hLSock = socket(AF_INET,SOCK_STREAM,0);
if(hLSock!=INVALID_SOCKET)
{
SOCKADDR_IN addr_Sock;
addr_Sock.sin_family = AF_INET;
addr_Sock.sin_addr.s_addr = htonl(INADDR_ANY);
addr_Sock.sin_port = htons(port);
if(bind(hLSock,(LPSOCKADDR)&addr_Sock,sizeof(addr_Sock))!=SOCKET_ERROR)
{
if (listen(hLSock,1)!=SOCKET_ERROR)
{
while(!iReset)//Accept loop
{
int size=sizeof(addr_Sock);
SOCKET hWSock= accept(hLSock,(LPSOCKADDR)&addr_Sock,&size);
if(hWSock!=INVALID_SOCKET)
{
int i=StartSession(hWSock,addr_Sock);
if(!i)iReset=1;
if(i<0) iOff=1;
}
else//accept
{
ErrorFunc(5);
}
shutdown(hWSock,0);
closesocket(hWSock);
}//Accept loop
}
else//listen
{
ErrorFunc(4);
}
}
else//bind
{
ErrorFunc(3);
}
shutdown(hLSock,1);
closesocket(hLSock);
}
else//Creat listen sock
{
ErrorFunc(2);
}
WSACleanup();
}
else//WSAStartup
{
ErrorFunc(1);
}
Sleep(2000);
}//Main loop
return 0;
}
Код:
//NetFunc.cpp
#include <winsock2.h>
#define SOCK_TOUT 5000000;
/////////////////////////////////////////////Send data
int SendData(SOCKET hSock, char *pBuffer, int len)
{
/////Encrypt
/////
int ts=0;
int ss=0;
timeval SendTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(hSock, &fds);
SendTimeout.tv_sec=0;
SendTimeout.tv_usec=SOCK_TOUT;
while(len > 0)
{
ts = select(0, NULL, &fds, NULL, &SendTimeout);
if(!ts) return -1;//time out
if(ts < 0) return -2;//sel error
ss = send(hSock, pBuffer, len, 0);
if(ss < 0)
return -3;//send error
else
{
len -= ss;
pBuffer += ss;
}
}
return 0;//ok
}
////////////////////////////////////////////Recv data
int RecvData(SOCKET hSock, char *pBuffer, int len)
{
int ts=0;
int rs=0;
timeval ReceiveTimeout;
fd_set fds;
FD_ZERO(&fds);
FD_SET(hSock, &fds);
ReceiveTimeout.tv_sec = 0;
ReceiveTimeout.tv_usec = SOCK_TOUT;
while(len > 0)
{
ts = select(0, &fds, NULL, NULL, &ReceiveTimeout);
if(!ts) return -1;//time out
if(ts<0) return -2;//sel error
rs = recv(hSock, pBuffer, len, 0);
if(rs < 0)
{
return -3;//recv error
}
else
{
len -= rs;
pBuffer += rs;
}
}
/////Decrypt
/////
return 0;//ok
}
////////////////////////////////////////////
Код:
//executer.cpp
#include "NetFunc.h"
#include <windows.h>
int StartSession(SOCKET hSock,SOCKADDR_IN addr_Sock)
{
char Buff[4];
char szCom[3];
char szSubCom[3];
//ident
//logon
//exec. comands
while(1)
{
if (recv(hSock,&Buff[0],sizeof(Buff[0]),MSG_PEEK)<=0) return WSAGetLastError();
if (RecvData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
//analyze comand
for(int i=0;sizeof(Buff)-1;i++)
{
if(i<2)szCom[i]=Buff[i];
else szSubCom[i-2]=Buff[i];
}
szCom[3]=0;
szSubCom[3]=0;
switch(atoi(szCom))
{
case 0:break;
case 1:break;
case 2:break;
default: return 1;
}
//analyze comand
if (SendData(hSock,&Buff[0],sizeof(Buff))!=0) return WSAGetLastError();
}
return 0;
}
Последний раз редактировалось X-lord; 01.08.2007 в 15:28..
|
|
|

01.08.2007, 14:59
|
|
Banned
Регистрация: 16.12.2006
Сообщений: 27
Провел на форуме: 110871
Репутация:
-17
|
|
сорри за флуд... какой тег исп. для оформления кода?
|
|
|

01.08.2007, 15:13
|
|
Banned
Регистрация: 11.08.2006
Сообщений: 1,522
Провел на форуме: 5128756
Репутация:
2032
|
|
Сообщение от X-lord
сорри за флуд... какой тег исп. для оформления кода?
[C0DE]...[/C0DE] вместо 0 = O
|
|
|

01.08.2007, 17:07
|
|
Участник форума
Регистрация: 11.07.2006
Сообщений: 125
Провел на форуме: 413927
Репутация:
71
|
|
2 x-lord ИМХО стараюсь избегать высокой вложенности кода
к примеру вместо
если (функция=выпонилась_правил но) то {большой_набор_операторов}
предпочитаю
если (финкция=выполнилась_не_пра вильно) то выход
{большой_набор_операторов}
еще
while(len > 0)
{
ts = select(0, &fds, NULL, NULL, &ReceiveTimeout);
if(!ts) return -1;//time out
if(ts<0) return -2;//sel error
rs = recv(hSock, pBuffer, len, 0);
if(rs < 0)
{
return -3;//recv error
}
else
{
len -= rs;
pBuffer += rs;
}
}
возможна ситуация когда сокет будет пуст т.е. все данные которые на него пришли прочитаны, но bufer еще не заполнен тогда если на том конце не запретили передачу данных на сокет то recv остановит выполнение функции т.к. будет ждать данных которые не придут.
тут надо ввести договоренность что все передаваемые сообщения будут заканчиваться какой то комбинацией и тебе надо считывать пока она не придет
Последний раз редактировалось da_ff; 01.08.2007 в 17:32..
|
|
|

01.08.2007, 18:05
|
|
Banned
Регистрация: 16.12.2006
Сообщений: 27
Провел на форуме: 110871
Репутация:
-17
|
|
там таймаут какраз для устранения такой комбинации и связанных с ней переполнений...
если пришло меньше лен то можно сушить ласты...
диалоговый режим.
|
|
|

01.08.2007, 19:06
|
|
Участник форума
Регистрация: 11.07.2006
Сообщений: 125
Провел на форуме: 413927
Репутация:
71
|
|
2 X-lord
ты всегда будешь знать сколько бай прочитать? сомневаюсь
это будет работать хорошо только локально, в условиях wan будут проблемы, возможны задержки проблемы с сетью возможно за тайм-аут все данные не успеют придти
в любом случае код очень не универсален и в другой ситуации работать будет не стабильно
кстати я щас тоже сетевым кодингом увлекся стучи в асю будем обмениваться опытом =)
Последний раз редактировалось da_ff; 01.08.2007 в 19:11..
|
|
|

01.08.2007, 19:40
|
|
Banned
Регистрация: 16.12.2006
Сообщений: 27
Провел на форуме: 110871
Репутация:
-17
|
|
всмотрись в код получьше...
приняли неполностью - ждём...
неприняли часть вообще - выходим по таймауту...
по задумке в разных частях программы будут разные размеры буферов
функции реализованны синхронно
допустим клиент передаёт команду в 4 байта
2 байта читаются как выбор функции 2 - спускаются на уровень ниже
и читаются как выбор операции(пока нереализованно)допустим функция - файловый менеджер, команда - код операции.
сервер переходит в режим сессии с файл. менеджером
клиент переходит в режим приёма ответа в 2048б
сервер передаёт список дисков, если всё невлезло то приписывает упр. команду кот. это показывает...
клиент это всё принимает(если есть команда "есть ещё" то принимает опять....)
и посылает следующую команду... смысл ясен?
цель-защита от переполнений+устойчивость к сбоям
проще непридумал...
такой способ больше подходит Udp
всё... спать пошёл
Последний раз редактировалось X-lord; 01.08.2007 в 19:45..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|