PDA

View Full Version : C e socket


SteR9
07-11-2003, 06:36
sono abbastanza bravo a programmare in C ma non ho mai utilizzato i socket...come IDE uso turbo C della borland...dove posso trovare una guida ai socket e le librerie che mi mancano??
grazie

mjordan
07-11-2003, 08:42
Dipende da che socket devi usare. Essi dipendono dal sistema operativo. Per i socket Unix trovi quanta documentazione vuoi. Per il Borland C dovresti chiedere a Borland ... :D

SteR9
07-11-2003, 08:48
Originariamente inviato da mjordan
Dipende da che socket devi usare. Essi dipendono dal sistema operativo. Per i socket Unix trovi quanta documentazione vuoi. Per il Borland C dovresti chiedere a Borland ... :D
eh lo so che per unix è una passeggiata...ma a me serve scrivere un applicazione in C per win...il compilatore lo posso anche cambiare cmq... :)

mjordan
07-11-2003, 08:55
Guarda io sotto Windows non sono molto preparato ma posso dirti che un insieme abbastanza grosso delle socket Unix funziona anche sotto Windows. Esistono anche le Windows Socket ma pare ne parlino male. Male che va, ti scarichi cygwin :sofico:

ilsensine
07-11-2003, 09:25
Windows usa dei wrapper per implementare i socket BSD standard. L'unico fastidio è la necessità di chiamare una funzione in più di inizializzazione tipica di win32. Le funzioni BSD-like sono mappate sulle API Winsock, e sono abbastanza aderenti allo standard.

Se non hai necessità che il tuo programma possa essere portato su altri sistemi operativi, ti consiglio di studiarti la libreria Winsock, che è l'ambiente naturale per win32. Altrimenti, usa le funzioni BSD standard.

Alcuni ambienti di sviluppo (ad es. Borland Builder ecc.) forniscono funzioni (classi) per maneggiare i socket in maniera molto agevole. Usandele però perdi non solo la compatibilità con altri sistemi operativi, ma anche con altri compilatori.

A te la scelta :cool:

SteR9
07-11-2003, 09:53
Originariamente inviato da ilsensine
Windows usa dei wrapper per implementare i socket BSD standard. L'unico fastidio è la necessità di chiamare una funzione in più di inizializzazione tipica di win32. Le funzioni BSD-like sono mappate sulle API Winsock, e sono abbastanza aderenti allo standard.

Se non hai necessità che il tuo programma possa essere portato su altri sistemi operativi, ti consiglio di studiarti la libreria Winsock, che è l'ambiente naturale per win32. Altrimenti, usa le funzioni BSD standard.

Alcuni ambienti di sviluppo (ad es. Borland Builder ecc.) forniscono funzioni (classi) per maneggiare i socket in maniera molto agevole. Usandele però perdi non solo la compatibilità con altri sistemi operativi, ma anche con altri compilatori.

A te la scelta :cool:
a me interessa scrivere un programma che giri in dos...non mi interessa la portabilità su altri sistemi....quindi cosa mi conviene fare?? :)

ilsensine
07-11-2003, 10:54
Per dos non è semplice (il dos non ha di per se uno stack ip). Ti consiglio almeno win32 (anche console su win32, non è necessario che programmi in interfaccia grafica).

SteR9
07-11-2003, 10:55
Originariamente inviato da ilsensine
Per dos non è semplice (il dos non ha di per se uno stack ip). Ti consiglio almeno win32 (anche console su win32, non è necessario che programmi in interfaccia grafica).
sisi intendevo console su win32...cmq basta che non debba usare interfaccia grafica per quello uso altri linguaggi :)
cmq non è che mi potresti indirizzare a qualche doc??
grazie

ilsensine
07-11-2003, 11:14
Se installi un compilatore "moderno" (builder, vc ecc.) ti viene anche installato il file .hlp di winsock.

cionci
07-11-2003, 11:58
Con Turbo C è quasi impossibile... Turbo C genera eseguibili a 16 bit esclusivamente epr DOS... Quidni non puoi utilizzare lo stack TCP/IP di Windows...

Per i socket su Windows sono praticamente uguale a quelli Linux... Non si possono usare read e write, ma solo send e recv...

SteR9
07-11-2003, 15:08
mmm quindi che compilatore mi conviene scaricare??
devc++ va bene??

cionci
07-11-2003, 18:05
Come compilatore sicuramente MinGW...come IDE MinGW Developer Studio o Dev-C++...vedi tu....

SteR9
07-11-2003, 19:12
Originariamente inviato da cionci
Come compilatore sicuramente MinGW...come IDE MinGW Developer Studio o Dev-C++...vedi tu....
ho scaricato dev-c++...ora però mi servirebbe una guida con qualche esempio su winsock :)
su google non trovo nulla di ben chiaro....
grazie

mjordan
08-11-2003, 09:44
Guarda quì:
http://www.google.it/search?q=Winsock+tutorial&ie=UTF-8&oe=UTF-8&hl=it&btnG=Cerca+con+Google&lr=

mjordan
08-11-2003, 09:45
Potrebbe esserti utile anche la F.A.Q.:
http://tangentsoft.net/wskfaq/

SteR9
08-11-2003, 14:51
ho provato alcuni esempi...ma non ne va nemmeno uno...
non so se è colpa di dev-c++...
cmq mi da sempre questo errore
[Linker error] undefined reference to `WSAStartup@8'
e anche molti altri....
non è che qualcuno ha un esempio funzioanante?? :muro:

cionci
08-11-2003, 16:06
Devi linkare il file libws2_32.a al progetto !!!

SteR9
08-11-2003, 17:39
ok ora funziona :D
però per esempio ho provato questo programma

#include <winsock.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MESSAGE "Hello, Server!\n"



int main(int argc, int **argv)

{

WSADATA wsda; // Structure to store info

// returned from WSAStartup



struct hostent *host; // Used to store information

// retreived about the server



char szMessage[80];

int iMessageLen;

int ret;



char szInBuffer[128];

int iBufferLen;



char szAddress[64];

int iPort;



SOCKET s; // Our TCP socket handle

SOCKADDR_IN addr; // The host's address



// Check arguments

if(argc != 3 ||

(argc==2 && strcmp((char *) &argv[1][0], "/?")==0))

{

printf("wsclient server port\n");

printf(" server: the server to connect to\n");

printf(" port: the port on the remote server \n");

exit(1);

}



// Copy the IP address

strcpy(szAddress, (char *) &argv[1][0]);



// Get the remote port

iPort = atoi((char *) &argv[2][0]);



if(iPort<0 || iPort>65563)

{

printf("Invalid port number! (%s)\n", argv[2]);

exit(1);

}



// Copy the pre-defined message into a buffer

strcpy(szMessage, MESSAGE);



iMessageLen = strlen(szMessage);


// Load version 1.1 of Winsock



WSAStartup(MAKEWORD(1,1), &wsda);



// Create a TCP socket

printf("Creating socket...");

s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);



// Error?

if(s == SOCKET_ERROR)

{

printf("Error\nCall to socket(AF_INET, SOCK_STREAM, IPPROTO_IP); failed with:\n%d\n", WSAGetLastError());

exit(1);

}



printf("OK\n");



// Fill in the host information

addr.sin_family = AF_INET;

addr.sin_port = htons(iPort);

addr.sin_addr.s_addr = inet_addr(szAddress);



if(addr.sin_addr.s_addr == INADDR_NONE) // The address wasn't in numeric

// form, resolve it

{

host = NULL;

printf("Resolving host...");

host = gethostbyname(szAddress); // Get the IP address of the server

// and store it in host

if(host == NULL)

{

printf("Error\nUnknown host: %s\n", szAddress);

exit(1);

}

memcpy(&addr.sin_addr, host->h_addr_list[0],

host->h_length);

printf("OK\n");

}

// Connect to the server

printf("Connecting to %s:%d...",szAddress, iPort);

ret = connect(s, (struct sockaddr *) &addr, sizeof(addr));



if(ret == SOCKET_ERROR)

{

printf("Error\nCall to connect(s, (SOCKADDR) addr, sizeof(addr)); failed with:\n%d\n", WSAGetLastError());

exit(1);

}



printf("OK\n");



// Ready to send data



printf("Sending data...");

ret = send(s, szMessage, iMessageLen, 0);



if(ret == SOCKET_ERROR)

{

printf("Error\nCall to send(s, szMessage, iMessageLen, 0) failed with:\n%d\n", WSAGetLastError());

exit(1);

}

printf("OK\n");



printf("\"%s\" sent to %s\n", szMessage, szAddress);



// Receive data



printf("Waiting for a response...");

ret = recv(s, szInBuffer, sizeof(szInBuffer), 0);



if(ret == SOCKET_ERROR)

{

printf("Error\nCall to recv(s, szInBuffer, sizeof(szInBuffer), 0); failed with:\n%d\n", WSAGetLastError());

exit(1);

}

printf("Response recieved\n");



iBufferLen = ret; // recv() returns the number of bytes read



szInBuffer[iBufferLen] = '\0'; // convert to cstring



printf("Response recieved from %s:\n\"%s\"\n", szAddress, szInBuffer);
closesocket(s);



WSACleanup();



return 0;

}

me lo compila ma non va...perchè?!

SteR9
08-11-2003, 17:56
no scusa!!funziona!!grazie mille!