/* Content : This file is a service Time : 2017-06-21 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <stdbool.h> #include <errno.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include "Color.h" #define PORT 8888 #define SIZE 512 #define BACKLOG 100 int SockFd; bool flag = false; char SystemTime[1024]; //实现获取系统时间的接口 void GetSystemTime(){ struct timespec time; struct tm nowTime; clock_gettime(CLOCK_REALTIME,&time); localtime_r(&time.tv_sec,&nowTime); sprintf(SystemTime,"%04d-%02d-%02d %02d:%02d:%02d",nowTime.tm_year+1900,nowTime.tm_mon+1,nowTime.tm_mday,nowTime.tm_hour,nowTime.tm_min,nowTime.tm_sec); //printf("Time Buffer content is:%s\n",SystemTime); } //实现信号自处理方法 void SigFunction(int signo){ printf("Service Will Closed...\n"); sleep(3); close(SockFd); printf("Close Service Suceess!\n"); exit(0); } int main(int argc,char* argv[]){ //Create Socket SockFd = socket(AF_INET,SOCK_STREAM,0); if (SockFd == -1){ printf("Create socket Failed:%s(Error:%d)\n",strerror(errno),errno); exit(-1); }else{ printf("Create socket suceess!\nSockFd:%d\n",SockFd); } //Init sockaddr struct struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); //use sersockopt function int reuseaddr = 1; setsockopt(SockFd,SOL_SOCKET,SO_REUSEADDR,&reuseaddr,sizeof(int)); //bind socket and ip adress int result = bind(SockFd,(struct sockaddr*)&addr,sizeof(addr)); if(result == -1){ printf("Bind SockFd Failed:%s(Error:%d)\n",strerror(errno),errno); exit(-1); }else{ printf("Bind Scoket Fd suceess!\nBind result:%d\n",SockFd); } //on bind suceess,usr listen function result = listen(SockFd,BACKLOG); if (result == -1){ printf("listen Socket Failed:%s(Error:%d)\n",strerror(errno),errno); exit(-1); }else{ printf("Listen Sucess!\nListen result:%d\n",result); } //enter the while begin accept connect signal(SIGINT,SigFunction); printf("If you want quit,please input: Ctrl+C\n"); char recvBuffer[SIZE] = {0}; flag = true; while(flag){ struct sockaddr_in recv_addr; socklen_t recv_len = sizeof(recv_addr); int fd = accept(SockFd,(struct sockaddr*)&recv_addr,&recv_len); if (fd == -1){ printf("Accept Failed:%s(Error:%d)\n",strerror(errno),errno); exit(-1); }else{ printf("Accept Suceess!\nAccept result:%d\n",result); } char* ip = inet_ntoa(recv_addr.sin_addr); printf("Clinet: "BROWN"%s connected!\n",ip); //Create pid pid_t Pid; Pid = fork(); if (Pid == -1){ printf("Create pid failed:%s(Error:%d)\n",strerror(errno),errno); exit(-1); } if (Pid == 0){ if (signal(SIGINT,SIG_DFL) == SIG_ERR){ perror("signal"); exit(-1); } close(SockFd); while(flag){ result = recv(fd,recvBuffer,sizeof(recvBuffer),0); if (result < 0){ printf("Anything have not recved:%s(Error:%d)\n",strerror(errno),errno); exit(-1); } if(!strcmp(recvBuffer,"bye")){ printf("Clinet :%s Will OffLine\n",ip); break; } printf("From Clinet: %s Msg is:%s\n",ip,recvBuffer); //result = send(fd,"Msg Recved",12,0); GetSystemTime(); result = send(fd,SystemTime,sizeof(SystemTime),0); //if (result == -1){ // printf("Send Msg to Client Failed:%s(Error:%d)\n",strerror(errno),errno); // exit(-1); //} } close(fd); exit(0); } close(fd); //flag = false; } return 0; }
Clinet:此篇文章是为了回顾前几天看的TCP部分基础的点,临时敲的,如有错还请指出!#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdbool.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8888 #define BUFFERSIZE 1024 #define log printf bool Flag = false; int main(int argc, char* argv[]) { int SockFd; int Result; struct sockaddr_in ClinetAddr; SockFd = socket(AF_INET, SOCK_STREAM, 0); if (SockFd == -1) { log("Create SockFd Failed:%s(Error:%d)\n", strerror(errno), errno); exit(-1); } log("Create SockFd Successfull!\n"); ClinetAddr.sin_family = AF_INET; ClinetAddr.sin_port = htons(PORT); ClinetAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); Result = connect(SockFd, (struct sockaddr*)&ClinetAddr, sizeof(sockaddr)); if (Result == -1) { log("Connect to Service Failed:%s(Error:%d)\n", strerror(errno), errno); exit(-1); } char MsgBuffer[BUFFERSIZE] = { 0 }; Flag = true; while (Flag) { log("Enter you want to send to Service:\n"); fgets(MsgBuffer, sizeof(MsgBuffer), stdin); Result = send(SockFd, MsgBuffer, sizeof(BUFFERSIZE), 0); if (Result < 0) { log("Send Message to Service Failed:%s(Error:%d)\n", strerror(errno), errno); exit(-1); } if (!strcmp(MsgBuffer, "bye")) { log("Clinetg Will be quit...\n"); Sleep(3); break; } char RecvBuffer[BUFFERSIZE] = { 0 }; Result = recv(SockFd, RecvBuffer, sizeof(RecvBuffer), 0); if (Result < 0) { log("Recv Message Failed from Service:%s(Error:%d)\n", strerror(errno), errno); exit(-1); } log("From Service Message:%s\n", RecvBuffer); } close(SockFd); return 0; }
TCP编程一对多实例
最新推荐文章于 2024-04-21 18:53:48 发布