El lenguaje C implementa la comunicación por socket en el entorno scounix
//Servidor g++ -o xserv xserv.cpp -lsocket -lnsl -lresolv
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define szSTR 256
int do_listen(const int puerto, const int bTcp)
{
int s = 0, r = 0, o = 1;
struct sockaddr_in h;
memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; /p>
h.sin_port = htons(puerto);
h.sin_addr.s_addr = INADDR_ANY;
s = socket(AF_INET, bTcp?SOCK_STREAM:SOCK_DGRAM, 0 );
if (s < 1) { perror("socket(escuchar)"); return 0;}
r = setsockopt(s, SOL_SOCKET,SO_REUSEADDR, (char * )&o, sizeof(int));
if (r == -1) { perror("setsockopt(escuchar)");
r = bind( s, (struct sockaddr *)&h, sizeof(h));
if (r == -1) { perror("bind(listen)"); p> if (bTcp) {
r = escuchar(s, SOMAXCONN);
if (r == -1) { perror("escuchar()"); ;}
}/*end if*/
/*signal(SIGPIPE, SIG_IGN);*/
return s;
}/*end do_listen*/
typedef struct QUEUE {
int s;
>
struct QUEUE * next;
} Q;
void append(Q ** que, int sck)
{
if(!que || sck < 1) return;
Q * q = *que, *n = 0;
if(!q) { n = nueva Q ; n->s = sck; n->siguiente = 0; *que = n; retorno }
if(q->s == sck) retorno ;
(q->siguiente){ if(q->siguiente->s == sck) return; q = q->siguiente }
n = nuevo Q; ->siguiente = 0; q->siguiente = n;
}//end append
int max_value(Q * que, int oyente)
{
if(!que) return oyente + 1;
Q * q = que; int m = oyente;
while(q) { if(q ->s > m) m = q->s; q = q->siguiente }
return m + 1;
}//end max_value
int session(Q ** que, int oyente)
{
fd_set rd, er; Q * q = 0; char buf[256]=""; p>
if(!que || oyente < 1) return 0;
FD_ZERO(&rd); FD_ZERO(&er);
FD_SET(oyente, &rd); (oyente, &er);
q = *que; while(q) {
if(q->s) { FD_SET(q->s, &rd); q->s, &er); }
q= q->next;
}//end while
int r = select(max_value(* que, oyente), &rd, 0, &er, 0);
if(r == -1) devuelve 0;
if(r == 0) devuelve 1;
if(FD_ISSET(oyente, &er)) return 0;
if(FD_ISSET(oyente, &rd)) {
int s = aceptar(oyente, 0 , 0);
if(s < 1) return 0;
append(que, s);
}//end if
q = *que; mientras(q) {
if(q->s < 1) { q = q->siguiente }
if(FD_ISSE;
T(q->s, &er)) {
apagado(q->s, SHUT_RDWR);
cierre(q->s);
q=q->siguiente; continuar;
}//finalizar si
if(FD_ISSET(q->s, &rd)) {
r = recv(q->s, buf, 256, 0);
if(r>1) printf(buf);
}//end if
q = q->siguiente;
}//finalizar mientras
devolver 1;
}//finalizar sesión
int main(void)
{
Q * que = 0; socklen_t sklen = 0; int oyente = 0;
oyente = do_listen(21429, 1)
if(oyente < 1) { perror("escuchar()");
while(sesión(&que, oyente));
close(oyente);
return 0;
}/*end main*/
//Cliente g++ -o xclnt xclnt.cpp - lsocket -lnsl -lresolv -lpthread
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include < sys/time.h>
#include
#include
#include
#include
#include
#include
#define szSTR 256
#define SERVER_IP "127.0.0.1"
#define SERVERPORT 21429
int cnn(const char * ipstr, const int puerto)
{
struct sockaddr_in h;
memset(&h, 0, sizeof(h));
sin_family. =AF_INET;
h.sin_port = htons(puerto);
h.sin_addr.s_addr = inet_addr(ipstr);
int s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 1) { perror("socket(tcp)"); return 0;}
int r = connect(s, (struct sockaddr *)&h, sizeof(h)) ;
if (r == 0) devuelve s;
perror("connect()");
devuelve 0;
}//end cnn
typedef char (*SNDPRC)(void);
void * sender(void * proc)
{
int r = 0; char x[4]={0,'\n','\r',0};
SNDPRC prc = (SNDPRC) proc;
if(!prc) devuelve 0;
int sck = cnn(SERVER_IP, SERVERPORT);
if(sck < 1) devuelve 0;
printf("%x# OK\n",
for(int i = 0; i < 180; i++) {
x[0] = (*prc) ();
r = enviar(sck, x, 4, 0);
if(r < 0) break;
dormir(1);
}//siguiente i
return 0;
}//finalizar remitente
char s_abc(void) { return rand( ) * 26 /RAND_MAX + 'a'; }
char s_ABC(void) { return rand() * 26 /RAND_MAX + 'A';
char s_123(void) { return rand() * 10 /RAND_MAX + '0' }
int main(int argc, char *argv[])
{
srand (hora(0));
pthread_create(0, 0, &remitente, (void*)&s_abc);
pthread_create(0, 0, &remitente, (void*)&s_ABC) ;
remitente((void*)&s_123);
retorno 0;
}/*end principal*/