Sockets Programming IN C

10 отговора 302 прегледа
#1

Sockets Programming IN C

Imam slednia problem: pisha edna programa (na *nix sas C) koiato sas send() prashta commanda "HELP" kam SMTP server i sas recv() da pokazwa otgowora na systemata.NO wmesto otgowora kam commandata poluchawam bannera na SMTP demona.Mozhete li da mi kazhete kak da polucha otgowora?????

Отговор
в отговор на lnfluenza #2

Re: Sockets Programming IN C

Vednaga sled ustanovyavaneto na TCP vryzkata SMTP server-yt prashta banera si, predi oshte ti da mu pratish komanda. Izvod: Sled connect () s recv () poluchi banera, i togava razni komandichki. Za poveche info: [линк]

Отговор
в отговор на Potencialen emigrant #4

Re: Sockets Programming IN C

Mislia che naprawih towa koeto mi kaza no stawa pak sashtoto.Zizh sourca i ako mozhesh mi kazhi greshkata:

#define IP "216.167.69.4"
#define PORT 25

char *buf = "HELP";
char buffy[666];
char bufy[666];

int main() {

int fd;

struct sockaddr_in server;

fd = socket(AF_INET,SOCK_STREAM,0);

server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(IP);
memset(&(server.sin_zero), '\0', 8);

connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr));

recv(fd, bufy, sizeof(bufy), 0);
printf("%s", bufy);


send(fd, buf, sizeof(buf), 0);
recv(fd, buffy, sizeof(buffy), 0);
printf("%s", buffy);

return 0;

}


Редактирано от lnfluenza на

Отговор
в отговор на lnfluenza #5

Re: Sockets Programming IN C

1. Proveryavay za greshki. socket, connect, recv i send moje da propadat nyakyde, i taka ne mojesh da razberesh dali i zashto.
2. Ne e dostatychno sled connect da slojish prosto edno izvikvane na recv. Vj. RFC-to. Po standart tryabva da prochetesh vsichki redove, koito zapochvat s tricifreno desetichno chislo, i da spresh sled tozi, v koyto chisloto se sledva ot interval. Primer:

220-Pyrvi red. Sledvat oshte, shtoto sled 220 imame tire.
220 X1 NT-ESMTP Server iguane.domaine-internet.com (IMail 6.00 20965-2)

Отговор
в отговор на lnfluenza #6

Re: Sockets Programming IN C

Ops, i edna gruba greshka: tova spored teb kakvo e?
sizeof(buf)
Ako si mislish, che e dyljinata na niza "HELP", v golyama greshka si. Tova e razmeryt na char *. Na teb ti tryabva:
strlen (buf) * sizeof (char)

Отговор
в отговор на lnfluenza #7

Re: Sockets Programming IN C

server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(IP);
memset(&(server.sin_zero), '\0', 8);


trea da stane:
memset( &server, 0, sizeof( server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(IP);


syshto taka: char *buf="HELP"; trea da stane
char *buf = "HELP\r\n";

i send(fd, buf, sizeof(buf), 0); trea da stane
send( fd, buf, strlen(buf), 0);

za men li4no e zadylvitelno sled socket(), connect(), send() i recv() da se check za errors :>

rgdz
curly
Отговор
в отговор на Potencialen emigrant #8

Re: Sockets Programming IN C

strlen (buf) * sizeof (char)
e malko izlishno :>
strlen() fryshta dylvinata na stringa f chars :>

rgdz
curly
Отговор
в отговор на Potencialen emigrant #9

Re: Sockets Programming IN C

Chestno kazano ne razbiram towa parwoto deto napisa, naistina se setih che beshe strlen(buf), no bi li mi kazal kak tochno da stane.Kak da nakaram recv() da chete wsichki redowe???

Отговор
в отговор на curly #10

Re: Sockets Programming IN C

A send iska v baytove....
char ne e bayt.

Отговор
в отговор на lnfluenza #11

Re: Sockets Programming IN C

man socket
man connect
man recv
man send
Tyrsi neshto kato "return values" da vidish kak da razberesh funkciyata uspyala li e, ili ne. Ako ne - s perror (const char *) (estestveno, man perror) moje da izvedesh greshkata na ekrana i da prekratish izpylnenieto na programata. Pone shte vidish kakva e greshka, koyato moje da e nekorektni parametri (tvoya) ili sistemna.

Shto se otnasya do cheteneto na vsichki redove... Samo s edno izvikvane na recv nyama da stane, ili pone nikoy ne ti go garantira. Napravi si funkciya za chetene na red ot socket, koyato izvikva recv dokato poluchi nov red... Ili polzvay fstream, po-specialno konstruktoryt, koyto priema "int fd" parametyr. No znay, che e neprenosimo.
Eto i primer, koito moje da ti pomogne:

/* Telnet protocol constants (some of them). */
#define IAC 255
#define DONT 254
#define DO 253
#define WONT 252
#define WILL 251

static int SocketGetChar (int TheSocket)
{
unsigned char ucTheChar;

if (recv (TheSocket, (char *)&ucTheChar, 1, 0) == 1)
return ucTheChar;
return EOF;
}

static int SocketPrintF (int TheSocket, const char *strFormat, ...)
{
va_list ArgList;
int iRetVal;
ostrstream strstreamBuffer;

va_start (ArgList, strFormat);
strstreamBuffer.vform (strFormat, ArgList);
va_end (ArgList);
iRetVal = send (TheSocket, strstreamBuffer.str (), strstreamBuffer.pcount (), 0);
strstreamBuffer.freeze (0);
if (iRetVal == -1)
return EOF;
alarm (TIMEOUT);
return iRetVal;
}

int GetReply (int TheSocket)
{
int iCurrentChar;
string strBuffer, strLine;
char strReply [4];

for (;;strBuffer = "")
{
while ((char)(iCurrentChar = SocketGetChar (TheSocket)) != '\n')
{
if (iCurrentChar == IAC) /* The Telnet protocol. */
switch (iCurrentChar = SocketGetChar (TheSocket))
{
case WILL:
case WONT: {
iCurrentChar = SocketGetChar (TheSocket);
SocketPrintF (TheSocket, "%c%c%c", IAC, DONT, iCurrentChar);
}
break;
case DO:
case DONT: {
iCurrentChar = SocketGetChar (TheSocket);
SocketPrintF (TheSocket, "%c%c%c", IAC, WONT, iCurrentChar);
}
break;
case IAC: break;
default: continue;
}
if (iCurrentChar == EOF)
return 421;
strBuffer += (char)iCurrentChar;
}
strBuffer += '\n';

if (strBuffer.length () >= 4 && strBuffer [3] == ' ')
{
strncpy (strReply, strBuffer.c_str (), 3);
break;
}
}
return atoi (strReply);
}

Vajnoto e GetReply (). Ako go izvikash vednaga sled connect(), bi tryabvalo da ti vyrne 220, ako vsichko e OK.
Zabelejka: SocketPrintF e neprenosima (izpolzva GNU razshirenie ostrstream.vform (), i nyama da se kompilira dori s GCC 3.x+), sori, ama nyamam po-hubav primer pod ryka.

Редактирано от Potencialen emigrant на

Отговор