PDA

View Full Version : Socket windows


dursino
27-03-2011, 12:13
Salve ragazzi dovrei compilare un programma banale che possa andare anche per xp e vista.
#include <stdio.h>
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>

#define SA struct sockaddr
struct sockaddr_in smurf,cl_addr; //Sock_addr per connect al Server
time_t rawtime;
struct tm * timeinfo;
char buffer [29];
int main()
{
FILE* f=fopen("./captf.txt","w");
int sk= socket(PF_INET, SOCK_STREAM, 0); //Creazione Socket Tcp per dialogare con Server
memset(&smurf, 0, sizeof(smurf));
smurf.sin_family = AF_INET;
smurf.sin_addr.s_addr = htonl(INADDR_ANY);

smurf.sin_port = htons(1236);
if (bind(sk, (SA *) &smurf, sizeof(smurf)) !=0 )
{ perror("!..BIND ..!\n");
exit (1);
}
unsigned short quanti=0;
while (quanti<20)
{
int ret = listen(sk, 10);
int len = sizeof(cl_addr);
int cn_sk = accept(sk, (SA *) &cl_addr, &len);
if(cn_sk == -1)
perror("nell'accept\n");
int pid=fork();
if (pid == 0)
{
time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime (buffer,80,"%c",timeinfo);
fprintf(f,"%s",buffer);
fprintf(f,"%c",'\t');
char *s=(char*)inet_ntoa(cl_addr.sin_addr);
fprintf(f,"%s",s);
fprintf(f,"%c",'\n');
return 0;
}
wait(NULL);
quanti ++;


}
return 0;
}

Questa è la versione su Unix, per farlo andare su Xp e Vista cosa devo cambiare?
Inet_pton non è supportata?
Grazie 1000

WarDuck
27-03-2011, 12:48
http://msdn.microsoft.com/en-us/library/ms741394(v=VS.85).aspx

tuccio`
27-03-2011, 13:50
fondamentalmente devi linkare ws2_32, inizializzarla con WSAStartup (http://msdn.microsoft.com/en-us/library/ms742213%28v=VS.85%29.aspx) e utilizzare winsock2.h come header

ps: oh wait, non avevo visto la fork :asd:

dursino
27-03-2011, 14:09
Scusate ho incollato il codice sbagliato,quello è lato server,che deve girare su unix quindi va bene.
Lato client è questo:
#include <Winsock2.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <string.h>
#include <stdlib.h>
#define SA struct sockaddr
struct sockaddr_in smurf; //Sock_addr per connect al Server
int main()
{
int sk= socket(PF_INET, SOCK_STREAM, 0); //Creazione Socket Tcp per dialogare con Server
if (sk == -1) return 1 ;
memset(&smurf, 0, sizeof(smurf));
smurf.sin_family = AF_INET;
smurf.sin_port = htons(1236);
int ret = inet_pton(AF_INET,"131.xx.xx.61", &smurf.sin_addr); //xx per privacy
if (!ret) return 8;
while(connect(sk,(SA*)&smurf,sizeof(smurf))) sleep(6);
exit (0);
}
In particolare da fastidio inet_pton

tuccio`
27-03-2011, 16:34
su visual studio includendo anche <WS2tcpip.h> compila (ovviamente rimuovendo gli header che non ci sono su windows e sostituendo sleep con Sleep)

su MinGW non compila comunque

tomminno
27-03-2011, 21:41
Ti manca l'inizializzazione di WinSocks, come già suggerito.
Infine inet_pton non è disponibile su Xp, ma solo da Vista in poi. In rete trovi implementazioni della funzione utilizzabili su Xp.