PDA

View Full Version : [C] Winsock errore in fase di binding


Sangio
12-10-2011, 13:26
ciao a tutti, scrivo perchè ho un problema molto antipatico, ho studiato in preparazione ad un esame universitario cosa sono le socket e come funzionano, con alcuni esempi di loro implementazioni purtroppo (per me) in ambiene UNIX, ho cercato qualche informazione per cominciare a realizzarne una io e ho cominciato la stesura di una socket server che faccia un local echo service.
(client logga, scrive ciao e gli ritorna ciao),
purtroppo non riesce a bindare la socket ad una porta... vi riporto il codice, sarei contentissimo se mi aiutaste a risolvere!
(SO Windows XP , localhost mi da qualche problema, non riesco a fare da cmd telnet localhost oppure telnet 127.0.0.1 ma non credo sia quello).

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
int main(int argc, char *argv[])
{

WSADATA wsaData;
if (WSAStartup(MAKEWORD(1,1), &wsaData) !=0){
printf("Winsock startup fallito\n");
exit(1);
}


int sock,nsock;
char buf[10];
struct sockaddr_in server,client;
server.sin_family=PF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(atoi(argv[1]));
if(sock = socket(PF_INET,SOCK_STREAM,0) ==-1)
{
printf("Error while creating the socket!\n");
system("PAUSE");
return 1;
}
printf("Ok, socket creata con id %d,\n",sock);
int sockaddr_len = sizeof(INADDR_ANY);
if(bind (sock, (struct sockaddr*)&server,sockaddr_len)==-1)
{
printf("Error while binding!\n");
system("PAUSE");
return 1;
}
printf("Ok, socket bindata alla porta %d dell' indirizzo %d\n",ntohs(server.sin_port), ntohs(server.sin_addr.s_addr));
if(listen(sock,2)==-1)
{
printf("Error while listening!\n");
system("PAUSE");
return 1;
}
while(1){
/*printf("Nuova sock, esito: %d\n",nsock=accept(sock, (struct sockaddr *)&client, &sockaddr_len)); /*continua a ripetere la frase perchè non fa
correttamente bind nè listen, quindi non riesce ad andare in recv */
recv(nsock,buf,1024,0);
send(nsock,buf,1024,0);
close(nsock);
}
system("PAUSE");
return 0;
}

usando netstat non rilevo alcuna attivita sulla porta che scelgo mentre richiamo il programma, e quest ultimo non procede oltre la fase di binding (ritorna solo "Error while binding.").

GRAZIE!

Sangio
12-10-2011, 13:45
con WSAGetLastError ho scoeprto che si tratta dell' errore 10038 :
Socket Error 10038 - The Descriptor is not a socket
any help? ;-)

Sangio
12-10-2011, 17:36
risolto ;-) la bind nell' if non andava molto d'accordo..