Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
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


PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
L'AI agentica potrebbe trasformare Inter...
Qualcomm lancerà due chip per sma...
Xiaomi dà i numeri: ecco come &eg...
AMD annuncia Ryzen 9 9950X3D2 Dual Editi...
CyrusOne avvia la costruzione del suo pr...
Cloud in crescita, ma l’adozione dell’IA...
OpenAI cancella l'adult mode di ChatGPT:...
Google Search Live arriva in Italia: la ...
MacBook Air 15'' con chip M4 (2025) crol...
Ora è possibile trasferire file t...
Apple domina con il MacBook Neo: i lapto...
Arriva la nuova gamma di PC Dell Pro per...
DJI Avata 360: la recensione del primo d...
Il browser di Samsung arriva su Windows,...
I satelliti AI Sat Mini per i datacenter...
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: 20:19.


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