多进程实现TCP并发服务器
#include<myhead.h>#define PORT 8888
#define IP "192.168.125.130"void hadder(int signo)
{if(signo == SIGCHLD){while(waitpid(-1,NULL,WNOHANG) > 0);}
}int information_exchange(int newfd,struct sockaddr_in cin)
{char buf[128]="";while(1){bzero(buf,sizeof(buf));int res = recv(newfd,buf,sizeof(buf),0);printf("%s\n",buf);if(res == 0){printf("断开连接\n");break;}//printf("%s\n",buf);strcpy(buf,"*-*");send(newfd,buf,sizeof(buf),0);}close(newfd);
}int main(int argc, const char *argv[])
{//给信号重新链接if(signal(SIGCHLD,hadder) == SIG_ERR){perror("signal error");return -1;}//创建套接字文件int sfd = -1;if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket error");return -1;}//重复链接设置端口快速重用int reuse = -1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1){perror("setsockopt error");return -1;}//传输IP和端口号struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");//设置监听模式if(listen(sfd,128) == -1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);int newfd = -1;pid_t pid = -1;while(1){//接受客户端链接if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen)) == -1){perror("accept error");return -1;}pid = fork();if(pid > 0){close(newfd);}else if(pid == 0){close(sfd);information_exchange(newfd,cin);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}}close(sfd);return 0;
}
多线程实现TCP并发服务器
#include<myhead.h>#define PORT 8888
#define IP "192.168.125.130"struct pthread_d
{int newfd;struct sockaddr_in cin;
};void* information_exchange(void* arg)
{int newfd = ((struct pthread_d*)arg)->newfd;struct sockaddr_in cin = ((struct pthread_d*)arg)->cin;char buf[128]="";while(1){bzero(buf,sizeof(buf));int res = recv(newfd,buf,sizeof(buf),0);printf("%s\n",buf);if(res == 0){printf("断开连接\n");break;}//printf("%s\n",buf);strcpy(buf,"*-*");send(newfd,buf,sizeof(buf),0);}close(newfd);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建套接字文件int sfd = -1;if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket error");return -1;}//重复链接设置端口快速重用int reuse = -1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1){perror("setsockopt error");return -1;}//传输IP和端口号struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");//设置监听模式if(listen(sfd,128) == -1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);int newfd = -1;pthread_t tid = -1;while(1){//接受客户端链接if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen)) == -1){perror("accept error");return -1;}struct pthread_d fifo={newfd,cin};if(pthread_create(&tid,NULL,information_exchange,&fifo) == -1){perror("pthread_create error");return -1;}pthread_detach(tid);}close(sfd);return 0;
}
TCP机械臂测试
#include<myhead.h>#define PORT 9998
#define SPORT 8888
#define IP "192.168.125.249"int main(int argc, const char *argv[])
{//创建套接字文件int sfd = -1;if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket error");return -1;}//重复链接设置端口快速重用int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1){perror("setsockopt error");return -1;}/*//传输IP和端口号struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");*/struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(SPORT);cin.sin_addr.s_addr = inet_addr(IP);if( connect(sfd, (struct sockaddr *)&cin,sizeof(cin)) ==-1){perror("connet error");return -1;}char rbuf[5]={0xff,0x02,0x00,0,0xff};unsigned char bbuf[5]={0xff,0x02,0x01,90,0xff};send(sfd,rbuf,sizeof(rbuf),0);send(sfd,bbuf,sizeof(bbuf),0);while(1){char flag;printf("请输入要控制的0|1>>>");scanf(" %c",&flag);getchar();switch(flag){case 'a':case 'A':{rbuf[3] += 5; if(rbuf[3] >= 90){rbuf[3] = 90;}send(sfd, rbuf, sizeof(rbuf), 0);}break;case 'b':case 'B':{rbuf[3] -= 5; if(rbuf[3] <= -90){rbuf[3] = -90;}send(sfd, rbuf, sizeof(rbuf), 0);}break;case 'C':case 'c':{bbuf[3] += 5; if(bbuf[3] >= 180){bbuf[3] = 180;}send(sfd, bbuf, sizeof(bbuf), 0);}break;case 'D':case 'd':{bbuf[3] -= 5; if(bbuf[3] <= 0){bbuf[3] = 0;}send(sfd, bbuf, sizeof(bbuf), 0);}break;}}return 0;
}