|
|
|
![]() |
|
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 00: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: 23:09.