/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Overvåge port og skrive indkommende data t~
Fra : Jens


Dato : 23-01-07 18:20

Hej,

Jeg vil gerne lave et program (server?) som overvåger en TCP/IP port
for indkommende data. De indkommende data skal skrives til en fil.

Er det svært? Eller er det en simpel opgave?

Hvis I kan anbefale nogle danske/engelske tutorials eller lige frem har
et link til noget C-kode der udfører ovenstående funktion, så må I endelig
poste det...

Tak på forhånd.




 
 
Jens (23-01-2007)
Kommentar
Fra : Jens


Dato : 23-01-07 18:22

glemte lige at nævne:

O/S : Windows XP
Udviklingsmiljø: MS Visual C++




Kent Friis (23-01-2007)
Kommentar
Fra : Kent Friis


Dato : 23-01-07 18:23

Den Tue, 23 Jan 2007 18:19:54 +0100 skrev Jens:
> Hej,
>
> Jeg vil gerne lave et program (server?) som overvåger en TCP/IP port
> for indkommende data. De indkommende data skal skrives til en fil.

Definer "overvåger".

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Jens (23-01-2007)
Kommentar
Fra : Jens


Dato : 23-01-07 18:45

> Definer "overvåger".

Holder øje med?

Jeg har ikke nogle skumle bagtanker med mit spørgsmål hvis det
er det du antyder?




Kent Friis (23-01-2007)
Kommentar
Fra : Kent Friis


Dato : 23-01-07 18:57

Den Tue, 23 Jan 2007 18:45:17 +0100 skrev Jens:
>> Definer "overvåger".
>
> Holder øje med?

Definer "overvåge" i teknisk forstand.

> Jeg har ikke nogle skumle bagtanker med mit spørgsmål hvis det
> er det du antyder?

Jeg antyder ikke noget, men svaret bliver vidt forskelligt alt efter
om du mener lytte/modtage connections, eller noget over i retning
af en firewall, eller måske tcpdump / wireshark agtigt.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Jens (23-01-2007)
Kommentar
Fra : Jens


Dato : 23-01-07 18:55

Her er noget kode jeg fandt på nettet. Jeg har forsøgt, at ændre lidt
i koden så serveren skriver indkommende data til bufferen i stedet
for at svare på hvor mange gange serveren er blevet kontaktet. Det virker
bare ikke ....måske er der nogen der kan hjælpe mig ?


/* server.c - code for example server program that uses TCP */


#ifndef unix
#define WIN32
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#endif

#include <stdio.h>
#include <string.h>

#define PROTOPORT 5193 /* default protocol port number */
#define QLEN 6 /* size of request queue */

int visits = 0; /* counts client connections */
int nbytes;
/*------------------------------------------------------------------------
* Program: server
*
* Purpose: allocate a socket and then repeatedly execute the following:
* (1) wait for the next connection from a client
* (2) send a short message to the client
* (3) close the connection
* (4) go back to step (1)
*
* Syntax: server [ port ]
*
* port - protocol port number to use
*
* Note: The port argument is optional. If no port is specified,
* the server uses the default given by PROTOPORT.
*
*------------------------------------------------------------------------
*/
main(argc, argv)
int argc;
char *argv[];
{
struct hostent *ptrh; /* pointer to a host table entry */
struct protoent *ptrp; /* pointer to a protocol table entry */
struct sockaddr_in sad; /* structure to hold server's address */
struct sockaddr_in cad; /* structure to hold client's address */
int sd, sd2; /* socket descriptors */
int port; /* protocol port number */
int alen; /* length of address */
char buf[1000]; /* buffer for string the server sends */

#ifdef WIN32
WSADATA wsaData;
WSAStartup(0x0101, &wsaData);
#endif
memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */
sad.sin_family = AF_INET; /* set family to Internet */
sad.sin_addr.s_addr = INADDR_ANY; /* set the local IP address */

/* Check command-line argument for protocol port and extract */
/* port number if one is specified. Otherwise, use the default */
/* port value given by constant PROTOPORT */

if (argc > 1) { /* if argument specified */
port = atoi(argv[1]); /* convert argument to binary */
} else {
port = PROTOPORT; /* use default port number */
}
if (port > 0) /* test for illegal value */
sad.sin_port = htons((u_short)port);
else { /* print error message and exit */
fprintf(stderr,"bad port number %s\n",argv[1]);
exit(1);
}

/* Map TCP transport protocol name to protocol number */

if ( ((int)(ptrp = getprotobyname("tcp"))) == 0) {
fprintf(stderr, "cannot map \"tcp\" to protocol number");
exit(1);
}

/* Create a socket */

sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);
if (sd < 0) {
fprintf(stderr, "socket creation failed\n");
exit(1);
}

/* Bind a local address to the socket */

if (bind(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
fprintf(stderr,"bind failed\n");
exit(1);
}

/* Specify size of request queue */

if (listen(sd, QLEN) < 0) {
fprintf(stderr,"listen failed\n");
exit(1);
}

/* Main server loop - accept and handle requests */

while (1) {
alen = sizeof(cad);
if ( (sd2=accept(sd, (struct sockaddr *)&cad, &alen)) < 0) {
fprintf(stderr, "accept failed\n");
exit(1);
}
visits++;

// udkommenteret følgende to linier
//sprintf(buf,"This server has been contacted %d
time%s\n",visits,visits==1?".":"s.");
//send(sd2,buf,strlen(buf),0);

// får fejl her (returkode -1)
nbytes=read(sd2,buf,strlen(buf));
printf("read %d bytes of data",nbytes);


closesocket(sd2);
}
}




Kent Friis (23-01-2007)
Kommentar
Fra : Kent Friis


Dato : 23-01-07 19:01

Den Tue, 23 Jan 2007 18:54:51 +0100 skrev Jens:
> nbytes=read(sd2,buf,strlen(buf));

sizeof?

strlen giver længden af *indholdet*, hvis der ikke er noget indhold
i forvejen, vil den returnere 0.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Jens (23-01-2007)
Kommentar
Fra : Jens


Dato : 23-01-07 19:06

>> nbytes=read(sd2,buf,strlen(buf));
>
> sizeof?
>
> strlen giver længden af *indholdet*, hvis der ikke er noget indhold
> i forvejen, vil den returnere 0.

prøvede at skrive sizeof istedet for, men får stadigvæk -1 i returværdi
når jeg sender en tekstfil fra en fjernpc til min private pc vha. IP-copy,
herunder:

ipcopy c:\filnavn.txt IP:xxx.xxx.xxx.xxx:port




Kent Friis (23-01-2007)
Kommentar
Fra : Kent Friis


Dato : 23-01-07 21:05

Den Tue, 23 Jan 2007 19:06:10 +0100 skrev Jens:
>>> nbytes=read(sd2,buf,strlen(buf));
>>
>> sizeof?
>>
>> strlen giver længden af *indholdet*, hvis der ikke er noget indhold
>> i forvejen, vil den returnere 0.
>
> prøvede at skrive sizeof istedet for, men får stadigvæk -1 i returværdi
> når jeg sender en tekstfil fra en fjernpc til min private pc vha. IP-copy,
> herunder:
>
> ipcopy c:\filnavn.txt IP:xxx.xxx.xxx.xxx:port

read() returnerer -1 ved fejl, og sætter så errno til fejl-koden.
Hvis du har perror(), så prøv at tilføje:

if(nbytes<0) perror("read");

Det burde så give fejlbeskeden. Eller det gør det i hvert fald på *nix-
systemer.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Martin M. Pedersen (07-04-2007)
Kommentar
Fra : Martin M. Pedersen


Dato : 07-04-07 18:18

Jens wrote:
> Hej,
>
> Jeg vil gerne lave et program (server?) som overvåger en TCP/IP port
> for indkommende data. De indkommende data skal skrives til en fil.
>

Prøv at kigge på Qt4 til windows. Det kan køres på få linier.
Der er f.x. en QTcpServer klasse.

http://doc.trolltech.com/4.2/qtcpserver.html

Mvh
Martin

Søg
Reklame
Statistik
Spørgsmål : 177422
Tips : 31962
Nyheder : 719565
Indlæg : 6407883
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste