Newsgroup: it.comp.programmare.win32
Titolo: n-esimo tentativo sui socket. w2_32.dll bacata ? (lungo)

Vi sembra possibile che nei due casi che riporto sotto
ci sia una differenza di comportamento
del tipo descritto in corrispondenza di ciascuna di esse
(uso Visual Studio 6 su Windows 95)?
(Alla fine del messaggio, alla voce "Riassumendo:", riassumo i punti
importanti per
capire dove e` il problema in modo che si possa inizialmente saltare
la lettura dei casi a) e b) )
caso a)
Creo una win32 console application come empty project. Il codice e` il
seguente
(Linko con ws2_32.lib)
#include <iostream.h>
#include <winsock2.h>
int main(){
  // initialize Winsock library
  WSADATA wsaData;
  WSADATA *lpwsaData=NULL;
  if (lpwsaData == NULL)
   lpwsaData = &wsaData;
  WORD wVersionRequested = MAKEWORD(1, 1);
  int nResult = WSAStartup(wVersionRequested, lpwsaData);
  if (nResult != 0)
   return FALSE;
  if (LOBYTE(lpwsaData->wVersion) != 1 || HIBYTE(lpwsaData->wVersion) != 1)
  {
   WSACleanup();
   return FALSE;
  }
  // setup for termination of sockets
  int s=socket(2,1,0);
  cout << s << ":" << GetLastError() << endl;
  WSACleanup();
}
Output:
-1:10044
Se vado a vedere nel manuale trovo il seguente codice di errore
WSAESOCKTNOSUPPORT
(10044)
Socket type not supported.
The support for the specified socket type does not exist in this address
family. For example, the optional type SOCK_RAW might be selected in a
socket call, and the implementation does not support SOCK_RAW sockets at
all.
?? Ma se la WSAStartup non e` fallita e la verifica ha funzionato ??
caso b)
creo una applicazione win32 console che supporta MFC.
Questa volta mi accorgo che tra le librerie linkate *non c'e`* ws2_32.dll!!
Il codice (una parte) e` il seguente
// def1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "def1.h"
#include <afxsock.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////
/
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;
   AfxSocketInit();
 // initialize MFC and print and error on failure
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: change error code to suit your needs
  cerr << _T("Fatal Error: MFC initialization failed") << endl;
  nRetCode = 1;
 }
 else
 {
  // TODO: code your application's behavior here.
  CString strHello;
  strHello.LoadString(IDS_HELLO);
  cout << (LPCTSTR)strHello << endl;
 }
 CSocket sock;
 sock.Create();
 sock.Connect("193.205.82.34",10001);
    cout << GetLastError()<<endl;
 return nRetCode;
}
Output:
Hello from MFC!
0
Dal lato server (Linux) vedo che una richiesta di connessione
e` stata accettata !! Quindi almeno la creazione del socket ha funzionato!!
Riassumendo:
Nel caso a) tento di usare winsock e ws2_32.dll per creare un socket =>
fallisco
Nel caso b) uso le MFC per lo stesso scopo => riesco.
Il codice del caso a) l'ho scritto andando a prendere quasi del tutto con il
cut and paste il codice che si trova all'interno della AfxSocketInit() (che
chiama
internamente una WSAStartup) e dei
metodi delle classi CSocket a CAsynchSocket (che chiamano la socket(...))
quindi dovrebbe essere lo stesso nei due casi.
La differenza mi sembra essere nelle librerie linkate.
Poiche` io di Windows e Visual Studio non capisco molto, mi rimane un dubbio
amletico:
Potrebe essere un baco della ws2_32.dll o sono solo io che non ho capito una
mazza ?
(Se mi dite che sono io che non capisco una mazza posso concordare in pieno,
ma gradirei ulteriori delucidazioni oltre alla affermazione:non capisci una
mazza!).
Grazie per l'attenzione,
Marco Guidi
P.S.
Tra le altre cose che dovrei fare c'e` quella di installare un server web su
windows 95.
Ho provato ad installare Apache 1.13.12 su Windows 95 ma la prima volta che
prova
a creare un socket fallisce e l'errore e` dello stesso tipo riportato al
caso a)
(L'ho scoperto dopo avere ricompilato tutto Apache e debuggato linea per
linea!!).
Prima di essere preso dalla tentazione di riscrivere da capo Apache usando
le MFC...
Qualcuno sa sa se esistono altri server web per W95 (avrei necessita` di far
eseguire
da un tale server delle cgi il cui sorgente e` in C/C++) ?

 lo stesso nei due casi.
La WSAStartup che chiama MFC e' quella di WSOCK32.DLL che internamente 
linka ws2_32.dll. 
Prova a linkare WSOCK32.LIB invece di WS2_32
Ciao
Bruno

  int s=socket(2,1,0);
probabilmente il terzo parametro (tipo di protocollo), che in winsock
corrisponde alla costante IPPROTO_IP non è valido. Devi specificare un
protocollo di livello superiore valido, come il TCP o l'UDP.
Ad esempio:
int s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
oppure, se preferisci i valori numerici "puri":
int s=socket(2, 1, 6);
Saluti,
	Marco.