Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 31-01-2010, 20:12   #1
Mulder90
Senior Member
 
L'Avatar di Mulder90
 
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
[C] WinSock, creazione semplice chat

Ciao a tutti.
Ultimamente mi sono messo a studiare i socket e ho fatto un client e un server il cui codice è quello sotto.
Il client riesce a scrivere messaggi al server che li riceve correttamente.
Volevo creare però qualcosa di più simile ad una chat dove il programma sia in grado di ricevere e spedire messaggi.
Dritte su come iniziare???

CLIENT:
Codice:
#include <stdio.h>
#include <winsock2.h>
#define close closesocket

int init_winsock(void)
{
    WSADATA wsadata;
    int err;
    err=WSAStartup(MAKEWORD(2,2),&wsadata);
    if(err!=0)
    return 0;
    else
    return 1;
}

int main()
{
	int sock, port;
	char ip[17];
    char buffer[256];
	struct sockaddr_in saddr;

	if(!init_winsock())
	{
		printf("Errore durante l'inizializzazione di winsock2.\n");
	    return -1;
	}

	printf("Server Ip: ");
	scanf("%16s", ip);

	printf("Server Port: ");
	scanf("%d", &port);

	if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("Errore durante la creazione del socket.\n");
		return -1;
	}

	saddr.sin_family = PF_INET;
	saddr.sin_addr.s_addr = inet_addr(ip);
	saddr.sin_port = htons(port);

	if(connect(sock, (struct sockaddr *) &saddr, sizeof(saddr)) < 0)
	{
		printf("Errore durante la connessione a %s:%d\n", ip, port);
		return -1;
	}

	printf("Connessione correttamente stabilita con %s:%d\n", ip, port);
	printf("Ora e' possibile digitare messaggi da inviare al server\n\n");

	do {
		printf("> ");
		fgets(buffer,256,stdin);
	}
	while(send(sock, buffer, sizeof(buffer), 0) > 0);

	printf("Connessione persa.\n");
	close(sock);
	WSACleanup();

	return 0;
}
SERVER:
Codice:
#include <stdio.h>
#include <winsock2.h>
#define close closesocket
init_winsock(void)
{
    WSADATA wsadata;
    int err;
    err=WSAStartup(MAKEWORD(2,2),&wsadata);
    if(err!=0)
    return 0;
    else
    return 1;
}

int main()
{
	int sock, clientsd, port = 5000;
	char buffer[256];
	struct sockaddr_in saddr;

	if(!init_winsock())
	{
	    printf("Errore durante l'inizializzazione di winsock2.\n");
	    return -1;
	}

	if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		printf("Errore durante la creazione del socket.\n");
		return -1;
	}

	saddr.sin_family = PF_INET;
	saddr.sin_addr.s_addr = INADDR_ANY;
	saddr.sin_port = htons(port);

	if((bind(sock, (struct sockaddr *) &saddr, sizeof(saddr))) < 0)
	{
		printf("Errore durante il binding del socket.\n");
		return -1;
	}

	if((listen(sock, 1)) < 0)
	{
		printf("Errore durante il settaggio del socket in listening.\n");
		return -1;
	}

	printf("In attesa che un client si connetta...\n");
	clientsd = accept(sock, NULL, NULL);
	printf("Si è connesso un client.\n\n");

	while(recv(clientsd, buffer, 255, 0) > 0)
	{
		printf("%s\a\n", buffer);
	}

	printf("Connessione persa.\n");
	close(sock);
	WSACleanup();

	return 0;
}
Mulder90 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2010, 20:59   #2
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Mulder90 Guarda i messaggi
Volevo creare però qualcosa di più simile ad una chat dove il programma sia in grado di ricevere e spedire messaggi.
Dritte su come iniziare???
creare una chat in C usando un socket é relativamente semplice: una volta impostata la connessione col peer basta che realizzi quella che io chiamo una "pompa di I/O", cioé un loop che legge bytes da un file descriptor e li sbatte su un altro. poi fai partire due threads ciascuno dei quali fa girare una pompa di I/O: un thread legge dal file descriptor di stdin e sbatte sul socket, e l'altro legge dal socket e sbatte su stdout. le syscall per realizzare una pompa di I/O sono read e write. da che so io non é indispensabile usare recv e send sui socket, i socket vengono trattati come normali file descriptors e quindi anche read e write funzionano su di essi.

edit - ah, occhio alle modalitá di flush.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2010, 22:55   #3
Mulder90
Senior Member
 
L'Avatar di Mulder90
 
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
Quote:
Originariamente inviato da fero86 Guarda i messaggi
creare una chat in C usando un socket é relativamente semplice: una volta impostata la connessione col peer basta che realizzi quella che io chiamo una "pompa di I/O", cioé un loop che legge bytes da un file descriptor e li sbatte su un altro. poi fai partire due threads ciascuno dei quali fa girare una pompa di I/O: un thread legge dal file descriptor di stdin e sbatte sul socket, e l'altro legge dal socket e sbatte su stdout. le syscall per realizzare una pompa di I/O sono read e write. da che so io non é indispensabile usare recv e send sui socket, i socket vengono trattati come normali file descriptors e quindi anche read e write funzionano su di essi.

edit - ah, occhio alle modalitá di flush.
potresti essere un po più chiaro? non ho capito molto bene il metodo
Mulder90 è offline   Rispondi citando il messaggio o parte di esso
Old 01-02-2010, 00:42   #4
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Altrimenti potresti far creare al server due thread (o più dipende da quanti client insieme vuoi far chattare)! Ogni thread riceverà un messaggio dal client e lo manderà in output sull'altro client!
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 01-02-2010, 01:22   #5
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Mulder90 Guarda i messaggi
potresti essere un po più chiaro? non ho capito molto bene il metodo
questa é quella che io chiamo "pompa di I/O" (scritta or ora, codice non testato, spero renda l'idea):
Codice:
void IoPump(int fdSource, int fdSink) {
	const size_t cbBuffer = 0x1000;
	char pBuffer[cbBuffer];
	while (1) {
		ssize_t nResult = read(fdSource, pBuffer, cbBuffer);
		if (nResult < 0) {
			return;
		}
		size_t cbRead = (size_t)nResult;

		size_t cbWritten = 0;
		while (cbWritten < cbRead) {
			nResult = write(fdSink, pBuffer + cbWritten, cbRead - cbWritten);
			if (nResult < 0) {
				return;
			}
			cbWritten += (size_t)nResult;
		}
	}
}
ora immaginati di avere un socket descriptor in una variabile di nome "s" ed immaginati di far partire due thread; uno dei due thread invoca:
Codice:
IoPump(0, s);
e l'altro invoca:
Codice:
IoPump(s, 1);
fine; hai fatto la chat.

Ultima modifica di fero86 : 01-02-2010 alle 01:25.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-02-2010, 13:43   #6
Mulder90
Senior Member
 
L'Avatar di Mulder90
 
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
Quote:
Originariamente inviato da clockover Guarda i messaggi
Altrimenti potresti far creare al server due thread (o più dipende da quanti client insieme vuoi far chattare)! Ogni thread riceverà un messaggio dal client e lo manderà in output sull'altro client!
su linux la funzione è fork() giusto?su windows?
Mulder90 è offline   Rispondi citando il messaggio o parte di esso
Old 01-02-2010, 13:45   #7
Mulder90
Senior Member
 
L'Avatar di Mulder90
 
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
Quote:
Originariamente inviato da fero86 Guarda i messaggi
questa é quella che io chiamo "pompa di I/O" (scritta or ora, codice non testato, spero renda l'idea):
Codice:
void IoPump(int fdSource, int fdSink) {
	const size_t cbBuffer = 0x1000;
	char pBuffer[cbBuffer];
	while (1) {
		ssize_t nResult = read(fdSource, pBuffer, cbBuffer);
		if (nResult < 0) {
			return;
		}
		size_t cbRead = (size_t)nResult;

		size_t cbWritten = 0;
		while (cbWritten < cbRead) {
			nResult = write(fdSink, pBuffer + cbWritten, cbRead - cbWritten);
			if (nResult < 0) {
				return;
			}
			cbWritten += (size_t)nResult;
		}
	}
}
ora immaginati di avere un socket descriptor in una variabile di nome "s" ed immaginati di far partire due thread; uno dei due thread invoca:
Codice:
IoPump(0, s);
e l'altro invoca:
Codice:
IoPump(s, 1);
fine; hai fatto la chat.
Grazie mille per la spiegazione...appena ho un po di tempo cerco di mettere in pratica
Mulder90 è offline   Rispondi citando il messaggio o parte di esso
Old 01-02-2010, 15:39   #8
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Mulder90 Guarda i messaggi
su linux la funzione è fork() giusto?su windows?
lo standard del C non prevede il multitasking; lo standard POSIX invece si, ma su Windows non é del tutto implementato (la fork ad esempio, per l'appunto, manca perché non é implementabile). se devi fare programmazione concorrente in C non puoi programmare cross-platform, il meglio che puoi fare é usare delle compilazioni condizionali; un'alternativa migliore secondo me é usare la select: non appena uno dei due file descriptors tra 0 e il socket é pronto per la lettura pompi bytes da esso. a quel punto peró non so se puoi usare la IoPump che ti ho scritto sopra, quella l'avevo scritta nell'ipotesi che tu programmassi per un solo sistema.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 01-02-2010, 15:40   #9
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Mulder90 Guarda i messaggi
su linux la funzione è fork() giusto?su windows?
comunque, per farla breve: http://msdn.microsoft.com/en-us/libr...53(VS.85).aspx

fero86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Tory Bruno ha lasciato la società...
L'immagine di Natale del telescopio spaz...
STMicroelectronics e SpaceX proseguono l...
Numeri da record, Xiaomi distribuisce ol...
BitLocker accelerato via hardware: Micro...
Blue Origin prosegue lo sviluppo dei lan...
Moore Threads: nuove GPU 15 volte pi&ugr...
Steam diventa esclusivamente 64-bit: Val...
La Corte Suprema restituisce a Elon Musk...
X lancia Creator Studio su mobile: nuovi...
Dieci anni fa SpaceX fece atterrare per ...
POCO M8 e M8 Pro arriveranno nel 2026: e...
Caos Formula 1: il motore Mercedes &egra...
Tariffe nazionali per le chiamate e gli ...
Tassa chilometrica non solo per elettric...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:08.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v