Newsgroup: it.comp.programmare.win32
Titolo: Sempre winsocket.....non va Kiuhnm ;(

Salve, sto facendo un programma che comunica con 
mail.tin.it
 su porta
25,funziona tutto bene, ma non riesco a mandare più di un comando al server.
Penso che il server legga male le stringhe successive alla prima...e infatti
mi dice che non conosce il comando.
Sapreste dirmi cosa fare?
X zello: se gets non va bene, cos'altro potrei usare? sai mica se potrebbe
essere proprio il gets a darmi quest'errore?
Potreste dirmi un'alternativa a gets che magari è più adatta a questo tipo
di operazioni?
Grazie
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <winsock.h>
#include <windows.h>
#include <dos.h>
main()
{
WSAData a;
long gg;
gg=WSAStartup (0x0101,&a);
struct sockaddr_in c;
int b;
int d;
int m;
int n;
int connesso=1;
int fine;
char e[999];
char stringa[0xff];
char invio[3];
invio[0]=0x0d;
invio[1]=0x0a;
b=socket(AF_INET,SOCK_STREAM,0);
c.sin_family=AF_INET;
c.sin_port=htons(25);
c.sin_addr.s_addr= inet_addr("212.216.176.224");
d=connect(b,(struct sockaddr *)&c,sizeof(c));
printf("Connessione a 
mail.tin.it
 porta 25...\n\n\n");
n=recv(b,e,999,0);
for(m=1;m<=n;m++)
printf("%c",e[m-1]);
do
{
  printf("Inserisci la stringa da inviare\n");
  gets(stringa);
  fine=strcmp(stringa,"fine");
  if(fine==0)
  {printf("INTERRUZIONE CICLO");break;}
  n=send(b,stringa,strlen(stringa),0);
  n=send(b,invio,strlen(invio),0);
  printf("\nOk. Attendere la risposta del server...\n");
  n=recv(b,e,999,0);
  for(m=1;m<=n;m++)
    printf("%c",e[m-1]);
  printf("stringa:%s\n",stringa);
}while(connesso==1);
printf("\n\n\nConnessione terminata\n\n");
closesocket(b);
}


Saluti,
zello
Nota: forse è meglio che non posti sempre lo stesso codice, lo recuperiamo
dagli altri articoli. Altrimenti finisci per sprecare banda.

 Mi sa che forse è il caso che fai il peek un carattere alla volta.
Gli host seguono un protocollo e quindi sai esattamente quando tutti i dati
sono stati inviati.
La recv blocca solo quando *nessun* dato viene inviato. Non aspetta 999
bytes. Ci mancherebbe altro :-)
Comunque adesso darò un'occhiata al codice...
Kiuhnm

Siamo un po' distratti, eh? :-)))
Mi sono permesso di modificarti leggermente il programma. Al limite rimetti
tutto com'era prima :-)
-----------------------------------
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <winsock.h>
#include <windows.h>
#include <dos.h>
void main()
{
 WSAData a;
 long gg;
 gg=WSAStartup (0x0101,&a);
 struct sockaddr_in c;
 int b;
 int d;
// int m;
 int n;
 int connesso=1;
 int fine;
 char e[1000];  // usa valori allineati: č piů efficiente!
 char stringa[0x100];
 char invio[3];
 invio[0]=0x0d;
 invio[1]=0x0a;
//!!!!!!!!!!!!!!!!!!!
invio[2] = 0;
//!!!!!!!!!!!!!!!!!!!
 b=socket(AF_INET,SOCK_STREAM,0);
 c.sin_family=AF_INET;
 c.sin_port=htons(25);
 c.sin_addr.s_addr= inet_addr("212.216.176.224");
 d=connect(b,(struct sockaddr *)&c,sizeof(c));
 printf("Connessione a 
mail.tin.it
 porta 25...\n\n\n");
 n=recv(b,e,1000,0);
 // Piů elegante...
 e[n] = 0;
 printf("%s\n",e);
 do
 {
//  printf("Inserisci la stringa da inviare\n");
  printf("> ");
  gets(stringa);
  fine=stricmp(stringa,"quit");  // case insensitive
  if (!fine) connesso = 0;
/*  if(fine==0)
  {
   // La connessione va chiusa inviando un QUIT al server
   printf("INTERRUZIONE CICLO");break;
  }*/
  n=send(b,stringa,strlen(stringa),0);
  n=send(b,invio,strlen(invio),0);
  printf("\nOk. Attendere la risposta del server...\n");
  n=recv(b,e,1000,0);
  // Piů elegante...
  e[n] = 0;
  printf("%s\n",e);
//  printf("stringa:%s\n",stringa);
 } while(connesso);
 printf("Connessione terminata\n\n");
 closesocket(b);
 WSACleanup();
}
-------------------
Kiuhnm