多进程实现TCP并发服务器
#include
#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
#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
#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;
}