天天看点

一个十分好SOCKET程序源代码(服务器端)

#include <sys/socket.h>

#include <errno.h>

#include <signal.h>

#include <string.h>

#define NUMERODEPUERTO 6666;

extern int apagar=0;

void signalhd(int senal);

void protocolo_control(int);

main() {

struct sockaddr_in sin, fsin;

int s, ssock, alen;

char *rchs;

sin.sin_family = AF_INET;

sin.sin_addr.s_addr = htonl(INADDR_ANY);

sin.sin_port = NUMERODEPUERTO;

if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {

perror("Cant create socket");

exit(1);

}

if (bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {

perror("Cant assign addres");

exit(2);

}

if (listen(s, 5) < 0) {

perror("Cant turn to listening mode");

exit(3);

}

signal (SIGCHLD, SIG_IGN);

signal (SIGINT,signalhd);

while (1) {

if (apagar){

close(s);

exit(0);

}

alen = sizeof(fsin);

if ((ssock=accept(s, (struct sockaddr *)&fsin, &alen)) < 0) {

if (errno == EINTR) continue;

perror("Accept failed");

exit(4);

}

rchs=(char *)inet_ntoa(fsin.sin_addr);

printf("/nConexion from : %s/n", rchs);

switch (fork()) {

case -1:{

perror ("Forking error");

exit (5);

}

case 0: {

close(s);

protocolo_control(ssock);

exit(0);

}

default: {

close(ssock);

break;

}

}

}

}

void protocolo_control(int Descriptor){

char buf[4096];

int cc;

cc = read (Descriptor, buf, sizeof buf);

if (cc > 0) {

printf("Readed data :/n%s/n", buf);

write(Descriptor, buf, strlen(buf));

}

}

void signalhd(int senal){

if (senal==SIGINT){

printf("...Interrupt.../n");

apagar=1;

}

}