Multiple processes
client
#include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() { //Create socket int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket"); exit(-1); } //connect to the server struct sockaddr_in serveraddr; inet_pton(AF_INET, "192.168.245.129", & amp;serveraddr.sin_addr.s_addr); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(9999); int ret = connect(lfd, (struct sockaddr *) & amp;serveraddr, sizeof(serveraddr)); if(ret == -1) { perror("connect"); _exit(-1); } //communication int i = 0; char receiveBuf[1024] = {0}; while(1) { sprintf(receiveBuf, "data: %d\\ ", i + + ); write(lfd, receiveBuf, strlen(receiveBuf)); sleep(1); int len = read(lfd, receiveBuf, sizeof(receiveBuf)); if(len == -1) { perror("read"); exit(0); } else if(len > 0) { printf("receive server data: %s\\ ", receiveBuf); } else if (len == 0) { printf("server closed..."); } } close(lfd); }
Service-Terminal
#define _XOPEN_SOURCE #include<stdio.h> #include<unistd.h> #include<arpa/inet.h> #include<string.h> #include<stdlib.h> #include<signal.h> #include<wait.h> #include<errno.h> void recyleChild(int arg) { while(1) { int ret = waitpid(-1, NULL, WNOHANG); if(ret == -1) { break; } else if (ret == 0) { break; } else if (ret > 0) { printf("pid %d is resaved\\ ", ret); } } } int main() { //Register signal capture function struct sigaction act; act.sa_flags = 0; sigemptyset( & amp;act.sa_mask); act.sa_handler = recyleChild; sigaction(SIGCHLD, &act, NULL); //Create socket int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket"); exit(0); } struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(9999); saddr.sin_addr.s_addr = INADDR_ANY; //Bind int ret = bind(lfd, (struct sockaddr*) & amp;saddr, sizeof(saddr)); if(ret == -1) { perror("bind"); exit(0); } //monitor ret = listen(lfd, 128); if(ret == -1) { perror("listen"); exit(0); } //Accept link while(1) { struct sockaddr_in cliaddr; int len = sizeof(cliaddr); int cfd = accept(lfd, (struct sockaddr*) & amp;cliaddr, & amp;len); if(cfd == -1) { if(errno == EINTR) { continue; } perror("accept"); exit(-1); } //For each connection, create a child process pid_t pid = fork(); if(pid == 0) { char clientIP[16]; inet_ntop(AF_INET, & cliaddr.sin_addr.s_addr, clientIP, 16); unsigned short cliPort = ntohs(cliaddr.sin_port); printf("Client Port is %d, client addr is %s\\ ", cliPort, clientIP); char recvBuf[1024] = {0}; while(1) { int len = read(cfd, & amp;recvBuf, sizeof(recvBuf)); if(len == -1) { perror("read"); return 0; } else if(len > 0) { printf("recv client data : %s \\ ", recvBuf); } else { printf("closed...."); } write(cfd, & amp;recvBuf, sizeof(recvBuf)); } close(cfd); exit(0); } } close(lfd); return 0; }
Multi-threading
server
#define _XOPEN_SOURCE #include<stdio.h> #include<unistd.h> #include<arpa/inet.h> #include<string.h> #include<stdlib.h> #include<errno.h> #include<pthread.h> struct sockinfo { int fd; struct sockaddr_in saddr; pthread_t tid; }; struct sockinfo sockinfos[128]; void* working(void* arg) { struct sockinfo* pinfo = (struct sockinfo*) arg; char clientIP[16]; inet_ntop(AF_INET, & amp;pinfo->saddr.sin_addr.s_addr, clientIP, 16); unsigned short cliPort = ntohs(pinfo->saddr.sin_port); printf("Client Port is %d, client addr is %s\\ ", cliPort, clientIP); char recvBuf[1024] = {0}; while(1) { int len = read(pinfo->fd, & amp;recvBuf, sizeof(recvBuf)); if(len == -1) { perror("read"); return 0; } else if(len > 0) { printf("recv client data : %s \\ ", recvBuf); } else { printf("closed...."); } write(pinfo->fd, & amp;recvBuf, sizeof(recvBuf)); } close(pinfo->fd); exit(0); return NULL; } int main() { //Create socket int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket"); exit(0); } struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(9999); saddr.sin_addr.s_addr = INADDR_ANY; //Bind int ret = bind(lfd, (struct sockaddr*) & amp;saddr, sizeof(saddr)); if(ret == -1) { perror("bind"); exit(0); } //monitor ret = listen(lfd, 128); if(ret == -1) { perror("listen"); exit(0); } //Initialization data int max = sizeof(sockinfos) / sizeof(sockinfos[0]); for(int i = 0; i < max; i + + ) { memset( & amp;sockinfos[i], 0, sizeof(sockinfos[i])); sockinfos[i].fd = -1; sockinfos[i].tid = -1; } //Accept link while(1) { struct sockaddr_in cliaddr; int len = sizeof(cliaddr); int cfd = accept(lfd, (struct sockaddr*) & amp;cliaddr, & amp;len); if(cfd == -1) { perror("accept"); exit(-1); } struct sockinfo *pinfo; for(int i = 0; i < max; i + + ) { if(sockinfos[i].fd == -1) { pinfo = &sockinfos[i]; break; } if(i == max - 1) { sleep(1); i--; } } pinfo->fd = cfd; memcpy( & amp;pinfo->saddr, & amp;cliaddr, len); //For each connection, create a child process pthread_create( & amp;pinfo->tid, NULL, working, pinfo); pthread_detach(pinfo->tid); } close(lfd); return 0; }
client
#include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() { //Create socket int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket"); exit(-1); } //connect to the server struct sockaddr_in serveraddr; inet_pton(AF_INET, "192.168.245.129", & amp;serveraddr.sin_addr.s_addr); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(9999); int ret = connect(lfd, (struct sockaddr *) & amp;serveraddr, sizeof(serveraddr)); if(ret == -1) { perror("connect"); _exit(-1); } //communication int i = 0; char receiveBuf[1024] = {0}; while(1) { sprintf(receiveBuf, "data: %d\\ ", i + + ); write(lfd, receiveBuf, strlen(receiveBuf)); sleep(1); int len = read(lfd, receiveBuf, sizeof(receiveBuf)); if(len == -1) { perror("read"); exit(0); } else if(len > 0) { printf("receive server data: %s\\ ", receiveBuf); } else if (len == 0) { printf("server closed..."); } } close(lfd); }