Переписать сишную прогу для IPV6

356ft85

Не очень ориентируюсь, но в каком месте нужно переписывать программу, которая нормально работает на IPV4 а вот если ей на вход подать ipv6 адрес то получаю Bad host name.
я так понимаю что это может быть связано с тем что где то в программе она опирается на то что после преобразования получает адрес в виде строки xxx.xxx.xxx.xxx ? или там нужно глобально отказываться от WINSOCK ?
кусок кода в котором на мой взгляд проблема
 

#define param struct clientparam*)data)
int res=0, i=0;
unsigned char* buf = NULL, *newbuf;
unsigned int inbuf, myslashcounter, myslashpos,stop, cc;
unsigned bufsize, reqlen = 0;
unsigned char *sb=NULL, *sg=NULL, *se=NULL, *sp=NULL,
*req=NULL, *su=NULL, *ss = NULL;
unsigned char *ftpbase=NULL;
unsigned char username[1024];
int keepalive = 0;
int contentlength = -1;
int isconnect = 0;
int transparent = 0;
int redirect = 0;
int prefix = 0, ckeepalive=0;
int ftp = 0;
int anonymous;
int sleeptime = 0;
SOCKET ftps;
SASIZETYPE sasize;




if(!(buf = myalloc(BUFSIZE {RETURN(21);}
//if(!(buf3 = myalloc(BUFSIZE {RETURN(21);}
bufsize = BUFSIZE;
anonymous = param->singlepacket;
for(;;){
memset(buf, 0, BUFSIZE);
inbuf = 0;
i = sockgetlinebuf(param, CLIENT, buf, LINESIZE - 1, '\n', (keepalive)?conf.timeouts[CONNECTION_S]:conf.timeouts[STRING_S]);

if(i<=0) {
RETURN(keepalive?555:509);
}
if (i==2 && buf[0]=='\r' && buf[1]=='\n') continue;
buf[i] = 0;
//printf("geted %s\r\n", buf);

myslashcounter=0;
myslashpos=0;

if(req) {
if(i<=prefix || strncasecmpchar *)buf, (char *)req, prefix{
ckeepalive = 0;
if(param->remsock != INVALID_SOCKET){
shutdown(param->remsock, SHUT_RDWR);
closesocket(param->remsock);
}
param->sins.sin_addr.s_addr = 0;
param->sins.sin_port = 0;
param->remsock = INVALID_SOCKET;
}
else if(ckeepalive && param->remsock!= INVALID_SOCKET){
struct pollfd fds;

fds.fd = param->remsock;
fds.events = POLLIN;
res = poll(&fds, 1, 0);
if(res) {
ckeepalive = 0;
if(param->remsock != INVALID_SOCKET){
shutdown(param->remsock, SHUT_RDWR);
closesocket(param->remsock);
}
param->sins.sin_addr.s_addr = 0;
param->sins.sin_port = 0;
param->remsock = INVALID_SOCKET;
}
}
myfree(req);
}
req = (unsigned char *)mystrdupchar *)buf);
if(!req){RETURN(510);}
if(i<10) {
RETURN(511);
}
if(!strncasecmpchar *)buf, "CONNECT", 7isconnect = 1;
if sb=(unsigned char *unsigned char *)strchrchar *)buf, ' ' == NULL) {RETURN(512);}
ss = ++sb;
if(!isconnect) {
if (!strncasecmpchar *)sb, "http://", 7 {
sb += 7;
}
else if (!strncasecmpchar *)sb, "ftp://", 6 {
ftp = 1;
sb += 6;
}
else if(*sb == '/') {
transparent = 1;
}
else {
RETURN (513);
}
}
else {
if se=(unsigned char *unsigned char *)strchrchar *)sb, ' ' == NULL || sb==se) {RETURN (514);}
*se = 0;
}
if(!transparent) {
if(!isconnect) {
if se=(unsigned char *unsigned char *)strchrchar *)sb, '/' == NULL
|| sb==se
|| !(sg=(unsigned char *)strchrchar *)sb, ' ' {RETURN (515);}
if(se > sg) se=sg;
*se = 0;
}
prefix = (intse - buf);
su = (unsigned char*)strchrchar *)sb, '@');
if(su) parseconnusernamechar *)sb, (struct clientparam *)param, (int)1, (unsigned shortftp)?21:80;
else parsehostnamechar *)sb, (struct clientparam *)param, (unsigned shortftp)? 21:80;
if(!isconnect){
if(se==sg)*se-- = ' ';
*se = '/';
memcpy(ss, se, i - (se - sb) + 1);
}
}
reqlen = i = (int)strlenchar *)buf);
if(!strncasecmpchar *)buf, "CONNECT", 7param->operation = HTTP_CONNECT;
else if(!strncasecmpchar *)buf, "GET", 3param->operation = (ftp)?FTP_GET:HTTP_GET;
else if(!strncasecmpchar *)buf, "PUT", 3param->operation = (ftp)?FTP_PUT:HTTP_PUT;
else if(!strncasecmpchar *)buf, "POST", 4param->operation = HTTP_POST;
else if(!strncasecmpchar *)buf, "HEAD", 4param->operation = HTTP_HEAD;
else param->operation = HTTP_OTHER;
do {
buf[inbuf+i]=0;
/*printf("Got: %s\n", buf+inbuf);*/
#ifndef WITHMAIN
if(i > 25 && (!strncasecmpchar *buf+inbuf "proxy-authorization", 19{
sb = (unsigned char *)strchrchar *buf+inbuf ':');
if(!sb)continue;
++sb;
while(isspace(*sbsb++;
if(!*sb) continue;
if(!strncasecmpchar *)sb, "basic", 5{
sb+=5;
while(isspace(*sbsb++;
i = de64(sb, username, 255);
if(i<=0)continue;
username[i] = 0;
sb = (unsigned char *)strchrchar *)username, ':');
if(sb){
*sb = 0;
if(param->password)myfree(param->password);
param->password = (unsigned char *)mystrdupchar *)sb+1);
param->pwtype = 0;
}
if(param->username)myfree(param->username);
param->username = (unsigned char *)mystrdupchar *)username);
continue;
}
if(!strncasecmpchar *)sb, "ntlm", 4{
sb+=4;
while(isspace(*sbsb++;
i = de64(sb, username, 1023);
if(i<=16)continue;
username[i] = 0;
if(strncasecmpchar *)username, "NTLMSSP", 8 continue;
if(username[8] == 1) {
while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S] > 2){
if(i> 15 && (!strncasecmpchar *buf "content-length", 14{
buf[i]=0;
contentlength = atoi(buf + 15);
}
}
if(contentlength){
while( contentlength > 0 && (i = sockgetlinebuf(param, CLIENT, buf, (BUFSIZE < contentlength)? BUFSIZE - 1:contentlength, '\n', conf.timeouts[STRING_S] > 0){
contentlength-=i;
}
}
if(param->password)myfree(param->password);
param->password = myalloc(32);
param->pwtype = 2;
i = (int)strlen(proxy_stringtable[13]);
memcpy(buf, proxy_stringtable[13], i);
genchallenge(param, (char *)param->password, (char *)buf + i);
memcpy(buf + strlenchar *)buf "\r\n\r\n", 5);
socksend(param->clisock, buf, (int)strlenchar *)buf conf.timeouts[STRING_S]);
ckeepalive = keepalive = 1;
goto REQUESTEND;
}
if(username[8] == 3 && param->pwtype == 2 && i>=80) {
unsigned offset, len;

len = username[20] + unsigned)username[21]) << 8);
offset = username[24] + unsigned)username[25]) << 8);
if(len != 24 || len + offset > (unsigned)i) continue;
memcpy(param->password + 8, username + offset, 24);
len = username[36] + unsigned)username[37]) << 8);
offset = username[40] + unsigned)username[41]) << 8);
if(len> 255 || len + offset > (unsigned)i) continue;
if(param->username) myfree(param->username);
unicode2textchar *)username+offset, (char *)username+offset, (len>>1;
param->username = (unsigned char *)mystrdupchar *)username+offset);
}
continue;
}
}
#endif
if(!isconnect && (
(i> 25 && !transparent && !strncasecmpchar *buf+inbuf "proxy-connection:", 17
||
(i> 16 && transparent && (!strncasecmpchar *buf+inbuf "connection:", 11
{
sb = (unsigned char *)strchrchar *buf

procenkotanya

зачем так издеваться над 3proxy?

Andbar

Как минимум, отличия ipv6 от ipv4 проявляются при:
1. создании сокета (другой параметр указывается);
2. заполнении структуры sockaddr (ошибка у тебя, скорее всего, выдаётся на этом этапе).
При беглом просмотре твоего кода, я не нашёл ни первого, ни второго.

356ft85

ак минимум, отличия ipv6 от ipv4 проявляются при:1. создании сокета (другой параметр указывается);2. заполнении структуры sockaddr (ошибка у тебя, скорее всего, выдаётся на этом этапе).При беглом просмотре твоего кода, я не нашёл ни первого, ни второго.
ГДе то тут?
 #ifndef MODULEMAINFUNC
#define MODULEMAINFUNC main
#define STDMAIN
#else
extern int linenum;
extern int haveerror;
#endif

int MODULEMAINFUNC (int argc, char** argv){

SOCKET sock = INVALID_SOCKET;
int i=0;
SASIZETYPE size;
pthread_t thread;
struct clientparam defparam;
int demon=0;
struct clientparam * newparam;
char *s;
int error = 0;
unsigned sleeptime;
struct extparam myconf;
unsigned char buf[256];
struct pollfd fds;
int opt = 1;
PROXYFUNC pf;
FILE *fp = NULL;
int maxchild;
int silent = 0;
int nlog = 5000;
char loghelp[] =
#ifdef STDMAIN
" -d go to background (daemon)\n"
#endif
" -fFORMAT logging format (see documentation)\n"
" -l log to stderr\n"
" -lFILENAME log to FILENAME\n"
" -bBUFSIZE size of network buffer (default 4096 for TCP, 16384 for UDP)\n"
#ifndef _WIN32
" -IDENT log to syslog IDENT\n"
#endif
" -t be silenT (do not log service start/stop)\n"
" -iIP ip address or internal interface (clients are expected to connect)\n"
" -eIP ip address or external interface (outgoing connection will have this)\n";

int childcount=0;
pthread_mutex_t counter_mutex;


#ifdef _WIN32
unsigned long ul;
#endif
#ifndef UDP
int new_sock = INVALID_SOCKET;
struct linger lg;
#endif
#ifdef _WIN32
HANDLE h;
#endif
#ifdef STDMAIN
#ifdef _WIN32
WSADATA wd;
WSAStartup(MAKEWORD( 1, 1 &wd);
#else
signal(SIGPIPE, SIG_IGN);

pthread_attr_init(&pa);
pthread_attr_setstacksize(&pa,PTHREAD_STACK_MIN + 16384);
pthread_attr_setdetachstate(&pa,PTHREAD_CREATE_DETACHED);
#endif
#endif


pf = childdef.pf;
memcpy(&myconf, &conf, sizeof(myconf;
memset(&defparam, 0, sizeof(struct clientparam;
defparam.version = paused;
defparam.childcount = &childcount;
defparam.logfunc = myconf.logfunc;
defparam.authfunc = myconf.authfunc;
defparam.aclnum = myconf.aclnum;
defparam.service = childdef.service;
defparam.usentlm = 1;
defparam.stdlog = NULL;
defparam.time_start = time(NULL);
maxchild = myconf.maxchild;

#ifndef STDMAIN
if(!conf.services){
conf.services = &defparam;
}
else {
defparam.next = conf.services;
conf.services = conf.services->prev = &defparam;
}
#endif

pthread_mutex_init(defparam.counter_mutex = &counter_mutex, NULL);

for (i=1; i<argc; i++) {
if(*argv[i]=='-') {
switch(argv[i][1]) {
case 'd':
if(!demon)daemonize;
demon = 1;
break;
case 'l':
defparam.logfunc = logstdout;
defparam.logtarget = (unsigned char*)mystrdup(argv[i]);
if(argv[i][2]) {
#ifdef STDMAIN
if(argv[i][2]=='@'){
#ifndef _WIN32
openlog(argv[i]+3, LOG_PID, LOG_DAEMON);
defparam.logfunc = logsyslog;
#endif
}
else
#endif
{
fp = fopen(argv[i] + 2, "a");
if (fp) {
defparam.stdlog = fp;
fseek(fp, 0L, SEEK_END);
}
}

}
break;
case 'i':
myconf.intip = getipunsigned char *)argv[i]+2);
break;
case 'e':
myconf.extip = getipunsigned char *)argv[i]+2);
break;
case 'p':
myconf.intport = atoi(argv[i]+2);
break;
case 'b':
myconf.bufsize = atoi(argv[i]+2);
break;
case 'n':
defparam.usentlm = 0;
break;
case 'f':
defparam.logformat = (unsigned char *)argv[i] + 2;
break;
case 't':
silent = 1;
break;
case 's':
case 'a':
myconf.singlepacket = 1 + atoi(argv[i]+2);
break;
default:
error = 1;
break;
}
}
else break;
}


#ifndef STDMAIN
if(childdef.port) {
#endif
#ifndef PORTMAP
if (error || i!=argc) {
#ifndef STDMAIN
haveerror = 1;
conf.threadinit = 0;
#endif
fprintf(stderr, "Usage: %s options\n"
"Available options are:\n"
"%s"
" -pPORT - service port to accept connections\n"
"%s"
"\tExample: %s -i127.0.0.1\n\n"
"%s",
argv[0], loghelp, childdef.helpmessage, argv[0],
#ifdef STDMAIN
copyright
#else
""
#endif
);

return (1);
}
#endif
#ifndef STDMAIN
}
else {
#endif
#ifndef NOPORTMAP
if (error || argc != i+3 || *argv[i]=='-'|| (myconf.intport = atoi(argv[i]==0 || (defparam.targetport = htonsunsigned short)atoi(argv[i+2]==0) {
#ifndef STDMAIN
haveerror = 1;
conf.threadinit = 0;
#endif
fprintf(stderr, "Usage: %s options"
" [-e<external_ip>] <port_to_bind>"
" <target_hostname> <target_port>\n"
"Available options are:\n"
"%s"
"%s"
"\tExample: %s -d -i127.0.0.1 6666 serv.somehost.ru 6666\n\n"
"%s",
argv[0], loghelp, childdef.helpmessage, argv[0],
#ifdef STDMAIN
copyright
#else
""
#endif
);
return (1);
}
defparam.target = (unsigned char *)mystrdup(argv[i+1]);
#endif
#ifndef STDMAIN
}
#endif
if(!defparam.logformat){
defparam.logformat = myconf.logformat;
}
if(defparam.logformat){
if(*defparam.logformat == '-' && (s = strchrchar *)defparam.logformat + 1, '+' && s[1]){
*s = 0;
defparam.nonprintable = (unsigned char *)mystrdupchar *)defparam.logformat + 1);
defparam.replace = s[1];
defparam.logformat = (unsigned char *)mystrdup(s + 2);
*s = '+';
}
else defparam.logformat = (unsigned char *)mystrdupchar *)defparam.logformat);
}
defparam.sinc.sin_addr.s_addr = defparam.intip = myconf.intip;
if(!myconf.intport)myconf.intport = childdef.port;
defparam.sinc.sin_port = defparam.intport = htons(myconf.intport);
defparam.sins.sin_addr.s_addr = defparam.extip = myconf.extip;
defparam.sins.sin_port = defparam.extport = htons(myconf.extport);
defparam.remsock = defparam.clisock = defparam.ctrlsock = INVALID_SOCKET;
defparam.sins.sin_family = defparam.sinc.sin_family = AF_INET;
defparam.singlepacket = myconf.singlepacket;
defparam.bufsize = myconf.bufsize;
#ifndef STDMAIN
conf.threadinit = 0;
#endif

#ifndef UDP
lg.l_onoff = 1;
lg.l_linger = conf.timeouts[STRING_L];
if( (sock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP == INVALID_SOCKET) {
#else
if( (sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP == INVALID_SOCKET) {
#endif
perror("socket");
return -2;
}
#ifdef _WIN32
ioctlsocket(sock, FIONBIO, &ul);
#else
fcntl(sock,F_SETFL,O_NONBLOCK);
#endif
defparam.srvsock = sock;
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(intperror("setsockopt");

size = sizeof(defparam.sinc);
for(sleeptime = SLEEPTIME * 100; bind(sock, (struct sockaddr*)&defparam.sinc, size)==-1; usleep(sleeptime {
sprintfchar *)buf, "bind: %s", strerror(errno;
(*defparam.logfunc&defparam, buf);
sleeptime = (sleeptime<<1);
if(!sleeptime) {
closesocket(sock);
return -3;
}
}
#ifndef UDP
if(listen (sock, 1 + (maxchild>>4==-1) {
sprintfchar *)buf, "listen: %s", strerror(errno;
(*defparam.logfunc&defparam, buf);
return -4;
}
#else
defparam.srvfds = &fds;
defparam.clisock = sock;
#endif

defparam.thr

valodyr

ГДе то тут?
Да, где-то тут.

Vadim69

тут, похоже. как исправить хз, с ipv6 дела не имел.

defparam.sinc.sin_addr.s_addr = defparam.intip = myconf.intip;
if(!myconf.intport)myconf.intport = childdef.port;
defparam.sinc.sin_port = defparam.intport = htons(myconf.intport);
defparam.sins.sin_addr.s_addr = defparam.extip = myconf.extip;
defparam.sins.sin_port = defparam.extport = htons(myconf.extport);
defparam.remsock = defparam.clisock = defparam.ctrlsock = INVALID_SOCKET;
defparam.sins.sin_family = defparam.sinc.sin_family = AF_INET;
defparam.singlepacket = myconf.singlepacket;
defparam.bufsize = myconf.bufsize;
#ifndef STDMAIN
conf.threadinit = 0;
#endif

#ifndef UDP
lg.l_onoff = 1;
lg.l_linger = conf.timeouts[STRING_L];
if( (sock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP == INVALID_SOCKET) {
#else
if( (sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP == INVALID_SOCKET) {
#endif
perror("socket");
return -2;
}
#ifdef _WIN32
ioctlsocket(sock, FIONBIO, &ul);
#else
fcntl(sock,F_SETFL,O_NONBLOCK);
#endif
defparam.srvsock = sock;
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(intperror("setsockopt");

size = sizeof(defparam.sinc);

Serab

Есть AF_INET6 и PF_INET6. Вообще, это все прекрасно описано в манах.

356ft85

Есть AF_INET6 и PF_INET6. Вообще, это все прекрасно описано в манах.
знать бы что читать..

Serab

man socket, man bind. Дальше по ссылкам :)

356ft85

можешь скинуть мне пример исходник на C++ где происходит метод connect к адресу 2a00:1450:8004::93: например
компилирую под MINGW на WIN32
пробовал уже разные методы, например при компиляции с использование getnameinfo выдёат unresolved external `getnameinfo`
мне бы примерчик заведомо рабочий в стиле
 int main(void)
{
struct sockaddr_in stSockAddr;
int i32Res;
int i32SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

if(-1 == i32SocketFD)
{
perror("Ошибка: не могу создать сокет");
exit(EXIT_FAILURE);
}

memset(&stSockAddr, 0, sizeof(stSockAddr;

stSockAddr.sin_family = PF_INET;
stSockAddr.sin_port = htons(1100);
i32Res = inet_pton(PF_INET, "192.168.1.3", &stSockAddr.sin_addr);

if(0 > i32Res)
{
perror("Ошибка: первый параметр не относится к категории корректных адресов");
close(i32SocketFD);
exit(EXIT_FAILURE);
}
else if(0 == i32Res)
{
perror("char string (Ошибка: второй параметр не содержит корректный IP-адрес");
close(i32SocketFD);
exit(EXIT_FAILURE);
}

if(-1 == connect(i32SocketFD, (const void *)&stSockAddr, sizeof(stSockAddr
{
perror("Ошибка соединения");
close(i32SocketFD);
exit(EXIT_FAILURE);
}

/* выполнение операций чтения и записи ... */

shutdown(i32SocketFD, SHUT_RDWR);

close(i32SocketFD);
return 0;
}

тока для IV6

salamander

Твой пример, только для IPv6. Ну и исправлены перепутанные PF_INET и AF_INET.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(void)
{
struct sockaddr_in6 stSockAddr;
int i32Res;
int i32SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);

if(-1 == i32SocketFD)
{
perror("Ошибка: не могу создать сокет");
exit(EXIT_FAILURE);
}

memset(&stSockAddr, 0, sizeof(stSockAddr;

stSockAddr.sin6_family = AF_INET6;
stSockAddr.sin6_port = htons(1100);
i32Res = inet_pton(AF_INET6, "2a00:1450:8004::93", &stSockAddr.sin6_addr);

if(0 > i32Res)
{
perror("Ошибка: первый параметр не относится к категории корректных адресов");
close(i32SocketFD);
exit(EXIT_FAILURE);
}
else if(0 == i32Res)
{
perror("char string (Ошибка: второй параметр не содержит корректный IP-адрес");
close(i32SocketFD);
exit(EXIT_FAILURE);
}

if(-1 == connect(i32SocketFD, (const void *)&stSockAddr, sizeof(stSockAddr
{
perror("Ошибка соединения");
close(i32SocketFD);
exit(EXIT_FAILURE);
}

/* выполнение операций чтения и записи ... */

shutdown(i32SocketFD, SHUT_RDWR);

close(i32SocketFD);
return 0;
}

356ft85

Это для линуха? я извиняюсь но в C++ опыта по нулям. Пробовал компилировать подобный код (уже находил в нете) - мне говорят например , что ф-ция inet_pton UNRESOLVED EXTERNAL.
сейчас у меня начало программы выглядит так:
 
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

#include <stdlib.h>

#include <stdio.h>

#include <Winsock2.h>

#include <ws2tcpip.h>

то есть всё под винду (mingw winxp)...........
ПОд винду не могу найти рабочий пример ipv6
В мэйке сделующие либы
LIBS = -lws2_32 -lodbc32
Я подозреваю что сюда надо что то еще дописать чтобы pton использовать

Serab

А код из первого сообщения компилится? Способ компиляции точно такой же, как и в случае второго кода?

356ft85

КУСКИ кода из первого и второго моих сообщений в теме компилятся (это исходники проги). способ тот же - просто даю команду make
с CMD из папки с исходником.

salamander

То бишь свой "заведомо рабочий примерчик" для IPv4 ты тоже скомпилить не можешь?
ф-ция inet_pton UNRESOLVED EXTERNAL

Ну зарезолвь. Или замени ее на что-нибудь.

356ft85

о бишь свой "заведомо рабочий примерчик" для IPv4 ты тоже скомпилить не можешь?
Да, ввёл в заблуждение..,т.к. не сразу разобрался.
То что сейчас есть в исходнике выглядит так:
 

if param->remsock=socket(ipv6?AF_INET6:AF_INET, SOCK_STREAM, IPPROTO_TCP == INVALID_SOCKET) {return (11);}
param->sins.sin_family = 0?AF_INET6:AF_INET;
if (ipv6){
printf("SOCK6 start!connect\n");
struct sockaddr_in6 sin6;
sin6.sin6_family = AF_INET6;
sin6.sin6_flowinfo = 0;
sin6.sin6_port = htons(80);
if (inet_pton(AF_INET6,"2a00:1450:8007::68:\0",&sin6.sin6_addr )>0) printf ("RSOLVE O\n");
if (connect(param->remsock, (struct sockaddr *) &sin6, sizeof(sin6 == -1) {return (13);}
}
else
if(connect(param->remsockstruct sockaddr *)&param->sins,sizeof(param->sins {return (13);}

пытаюсь скомпилить и вот вывод
     gcc -oout.exe -Wall -O2 -s -mno-cygwin -mthreads 3 tcpmainfun
c.o udpmainfunc.o auth.o datatypes.o srvpop3p.o srvftppr.o srvsocks.o
 srvtcppm.o srvudppm.o sockmap.o sockgetchar.o myalloc.o common.o mycrypt.o md5.
o md4.o base64.o ftp.o smbdes.o ntlm.o stringtable.o srvwebadmin.o srvdnspr.o -
lws2_32 -lodbc32
common.o:common.c:(.text+0x1858): undefined reference to `inet_pton'
collect2: ld returned 1 exit status

agaaaa

Ну не пользуйся им, пиши адрес сразу в двоичном виде.

356ft85

как то так(не уверен в порядке байтов _S6_u32[0])?

странно, но в итоге connect dcё равно выдаёт -1 хотя и адрес пингуется и телнет на 80 порт работает
 
struct sockaddr_in6 sin6;      
sin6.sin6_family = AF_INET6;
sin6.sin6_flowinfo = 0;
sin6.sin6_port = htons(80);//u_long _S6_u32[4];
sin6.sin6_addr._S6_un._S6_u32[0]=0x2a00;
sin6.sin6_addr._S6_un._S6_u32[1]=0x1450;
sin6.sin6_addr._S6_un._S6_u32[2]=0x8007;
sin6.sin6_addr._S6_un._S6_u32[3]=0x0068;

printf("try 6 connect\n");
if param->remsock=socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP == INVALID_SOCKET) {printf("error creating !\т"); return (11);}
if (connect(param->remsock, (struct sockaddr *) &sin6, sizeof(sin6 == -1) {printf("Error!\n"); return (13);}

salamander

как то так(не уверен в порядке байтов _S6_u32[0])?
А я вот уверен в их количестве: в u32 4 байта, а не два, как ты написал.

356ft85

так тоже пробовал.
-1 :(
 	sin6.sin6_addr._S6_un._S6_u32[0]=0x00002a00;
sin6.sin6_addr._S6_un._S6_u32[1]=0x00001450;
sin6.sin6_addr._S6_un._S6_u32[2]=0x00008007;
sin6.sin6_addr._S6_un._S6_u32[3]=0x00000068;

salamander

Не, ну скажи, что изменится от того, что ты допишешь лидирующие нули к константам?
sin6.sin6_addr._S6_un._S6_u32[0] = 0x2a001450;
sin6.sin6_addr._S6_un._S6_u32[1] = 0x80070000;
sin6.sin6_addr._S6_un._S6_u32[2] = 0x00000000;
sin6.sin6_addr._S6_un._S6_u32[3] = 0x00000068;

Но это будет правильно, только если у тебя хост BE, AFAIK.

356ft85

ну хость как можно понять из айпишника это GOOGLE.COM =)
В итоге не работает.
ВЫВОД:
 param->remsock = -1 try 6 connect
param->remsock = 1840
aram->remsock = 1840 Error connect!
КОД:

 
struct sockaddr_in6 sin6;
sin6.sin6_family = AF_INET6;
sin6.sin6_flowinfo = 0;
sin6.sin6_port = htons(80);//u_long _S6_u32[4];
sin6.sin6_addr._S6_un._S6_u32[0] = 0x2a001450;
sin6.sin6_addr._S6_un._S6_u32[1] = 0x80070000;
sin6.sin6_addr._S6_un._S6_u32[2] = 0x00000000;
sin6.sin6_addr._S6_un._S6_u32[3] = 0x00000068;

printf(" param->remsock = %d try 6 connect\n", param->remsock);
if param->remsock=socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP == INVALID_SOCKET) {printf("param->remsock = %d error creating !\т", param->remsock); return (11);}
printf("param->remsock = %d\n", param->remsock);
if (connect(param->remsock, (struct sockaddr *) &sin6, sizeof(sin6 == -1) {printf("aram->remsock = %d Error connect!\n", param->remsock); return (13);}

salamander

Под хост я имел ввиду хост из торйки build-host-target. То бишь компьютер, где выполняется программа. И да, я сильно смоневаюсь, что он у тебя Big-Endian.

356ft85

она выполняется на обычном компе официалки из оперы гугль http://%5B2a00:1450:8007::68:%5D превосходно открывается!

356ft85

Вернее гугль это 2a00:1450:8007::6a:
пробовал так
sin6.sin6_addr._S6_un._S6_u32[0] = 0x2a001450;
sin6.sin6_addr._S6_un._S6_u32[1] = 0x8007006A;
sin6.sin6_addr._S6_un._S6_u32[2] = 0x00000000;
sin6.sin6_addr._S6_un._S6_u32[3] = 0x00000000;
и так
sin6.sin6_addr._S6_un._S6_u32[0] = 0x2a001450;
sin6.sin6_addr._S6_un._S6_u32[1] = 0x80070000;
sin6.sin6_addr._S6_un._S6_u32[2] = 0x00000000;
sin6.sin6_addr._S6_un._S6_u32[3] = 0x0000006A;

salamander

Мда...
Короче, иди ботай матчасть (про сокеты, IP-адреса и их запись, endianness и прочее). А то ты сейчас как студент-двоечник на экзамене, пытающийся угадать формулировку теоремы.

356ft85

Короче, иди ботай матчасть (про сокеты, IP-адреса и их запись, endianness и прочее). А то ты сейчас как студент-двоечник на экзамене, пытающийся угадать формулировку теоремы.
Ну я щас явно не на экзамене =)
Насчет матчасти - пока нету времени ботать ее, я подозревал что задача как то легко решается. но видимо ошибался и всё не так просто.
Оставить комментарий
Имя или ник:
Комментарий: