Red de conocimiento informático - Problemas con los teléfonos móviles - El lenguaje C implementa la comunicación por socket en el entorno scounix

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]="";

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*/