|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
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;
}
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;
}
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
edit - ah, occhio alle modalitá di flush. |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
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!
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
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;
}
}
}
Codice:
IoPump(0, s); Codice:
IoPump(s, 1);
__________________
3D Volley Demo (Facebook) | Reversi (Facebook) | Blockout (Facebook) | Puzzle15 (Facebook) Ultima modifica di fero86 : 01-02-2010 alle 01:25. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
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.
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:08.




















