机械臂
#include "head.h"
/*TCP 客户端
控制机械臂
*/
#define PORT 8888
#define IP "192.168.125.62"
int main(int argc, char const *argv[])
{
//创建套接字
int cfd = -1; //文件标识符
if ((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket error");
return -1;
}
printf("cfd = %d \n", cfd);
//链接服务器
//填充服务器地址信息结构体
struct sockaddr_in s_a;
s_a.sin_family = AF_INET;
s_a.sin_port = htons(PORT);
s_a.sin_addr.s_addr = inet_addr(IP);
//链接
if (connect(cfd, (struct sockaddr *)&s_a, sizeof(s_a)) == -1)
{
perror("connect error");
return -1;
}
printf("connect success \n");
//数据收发
char wbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff};
char value = 0;
while (1)
{
//请输入内容
// printf("plesase enter control:");
value = getchar();
switch (value)
{
case 'W':
case 'w':
{
wbuf[2] = 0x00;
wbuf[3] += 5;
if (wbuf[3] >= 90)
{
wbuf[3] = 90;
}
send(cfd, wbuf, sizeof(wbuf), 0);
}
break;
case 'Q':
case 'q':
{
wbuf[2] = 0x00;
wbuf[3] -= 5;
if (wbuf[3] <= -90)
{
wbuf[3] = -90;
}
send(cfd, wbuf, sizeof(wbuf), 0);
}
break;
case 'E':
case 'e':
{
wbuf[2] = 0x01;
wbuf[3] += 2;
if (wbuf[3] >= 180)
{
wbuf[3] = 180;
}
send(cfd, wbuf, sizeof(wbuf), 0);
}
break;
case 'R':
case 'r':
{
wbuf[2] = 0x01;
wbuf[3] -= 2;
if (wbuf[3] <= 0)
{
wbuf[3] = 0;
}
send(cfd, wbuf, sizeof(wbuf), 0);
}
break;
default:
break;
}
}
close(cfd);
return 0;
}
tcp多线程
#include "head.h"
/*
Tcp 多线程实现并行服务器
*/
#define IP "192.168.125.65"
#define PORT 8080
struct pthread_ds
{
int tid;
struct sockaddr_in cin;
};
//处理收发
int deal_cli_msg(int newfd, struct sockaddr_in cin)
{
//收发数据
char rbuf[128] = "";
while (1)
{
bzero(rbuf, sizeof(rbuf));
int res = recv(newfd, rbuf, sizeof(rbuf), 0);
if (res == 0)
{
printf("客户端下线\n");
break;
}
printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);
// //链接一个字符串后发回去
strcat(rbuf, "*_*");
//发送信息 以阻塞的形式写入数据
send(newfd, rbuf, sizeof(rbuf), 0);
}
close(newfd);
pthread_exit(NULL);
return 0;
}
void *task(void *arg)
{
int newfd = (*(struct pthread_ds *)arg).tid;
struct sockaddr_in cin = (*(struct pthread_ds *)arg).cin;
deal_cli_msg(newfd, cin);
}
int main(int argc, char const *argv[])
{
/*
1, socket
2,bind
3,listen
4,accept
5,read
6,close
*/
int sfd = -1;
sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd == -1)
{
perror("socket error");
return -1;
}
// bind 结构体 将ip 端口号 转化为网络字节序
struct sockaddr_in s_a;
s_a.sin_family = AF_INET;
s_a.sin_port = htons(PORT);
s_a.sin_addr.s_addr = inet_addr(IP);
//绑定
int rest = bind(sfd, (struct sockaddr *)&s_a, sizeof(s_a));
if (rest == -1)
{
perror("bind error");
return -1;
}
printf("bind success \n");
//listen
if (listen(sfd, 128) == -1)
{
perror("listen error");
return -1;
}
printf("listen success\n");
//accept
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin);
int newfd = -1;
pthread_t tid = -1;
//循环创建套接字
while (1)
{
//创建用于收发消息的套接字
newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);
if (newfd == -1)
{
perror("accept error");
return -1;
}
printf("[%s:%d]链接成功\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
struct pthread_ds info = {newfd, cin};
if (pthread_create(&tid, NULL, task, &info) != 0)
{
perror("pthreadcreate error");
return -1;
}
pthread_detach(tid);
}
return 0;
}
tcp多进程
/*
并发服务器
多进程
*/
#include "head.h"
/*TCP 服务端*/
#define PORT 8888
#define IP "192.168.125.65"
//处理收发
int deal_cli_msg(int newfd, struct sockaddr_in cin)
{
//收发数据
char rbuf[128] = "";
while (1)
{
bzero(rbuf, sizeof(rbuf));
int res = recv(newfd, rbuf, sizeof(rbuf), 0);
if (res == 0)
{
printf("客户端下线\n");
break;
}
printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);
// //链接一个字符串后发回去
strcat(rbuf, "*_*");
//发送信息 以阻塞的形式写入数据
send(newfd, rbuf, sizeof(rbuf), 0);
}
close(newfd);
return 0;
}
//信号处理函数 回收进程资源
void handle(int signo){
if (signo == SIGCHLD)
{
while (waitpid(-1,NULL,WNOHANG)>0);
}
}
int main(int argc, char const *argv[])
{
//信号处理函数
if (signal(SIGCHLD,handle)== SIG_ERR)
{
perror("signal error");
return -1;
}
//创建套接字
int sfd = -1; //文件标识符
/*
AF_INET 跨主机的Ipv4
SOCK_STREAM tcp通讯
*/
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket error");
return -1;
}
printf("sfd = %d \n", sfd);
// bind 结构体 将ip 端口号 转化为网络字节序
struct sockaddr_in s_a;
s_a.sin_family = AF_INET;
s_a.sin_port = htons(PORT);
s_a.sin_addr.s_addr = inet_addr(IP);
//绑定
int rest = bind(sfd, (struct sockaddr *)&s_a, sizeof(s_a));
if (rest == -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 socklen = sizeof(cin);
int newfd = -1;
pid_t pid = -1;
while (1)
{
//接收客户端链接请求
if ((newfd = accept(sfd, (struct sockaddr *)&cin, &socklen)) == -1)
{
/* code */
perror("accept error");
return -1;
}
printf("[%s:%d]链接成功\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
pid = fork();
if (pid > 0)
{
close(newfd);
}
else if (pid == 0)
{
close(sfd);
deal_cli_msg(newfd, cin);
exit(EXIT_SUCCESS);
printf("退出成功\n");
}
else
{
perror("fork error");
return -1;
}
}
close(sfd);
return 0;
}