1.用多进程实现TCP并发服务器
#include
#define PORT 9999
#define IP "192.168.125.14"
// 信号处理函数
void handel(int signo)
{
if (signo == SIGCHLD) {
while (waitpid(-1, NULL, WNOHANG) > 0)
;
}
}
// 操作函数
int dows(int newfd, struct sockaddr_in cin)
{
// 5收发数据
char rbuf[128] = "";
while (1) {
bzero(rbuf, sizeof(rbuf));
int res = 0;
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;
}
int main(int argc, const char* argv[])
{
// 将信号绑定
if (signal(SIGCHLD, handel) == SIG_ERR) {
perror("signal error");
return -1;
}
// 1创建套接字文件
int sfd = -1;
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket perror");
return -1;
}
// 2绑定IP 端口
// 2.1定义结构体信息
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");
// 3监听
if (listen(sfd, 128) == -1) {
perror("listen error");
return -1;
}
printf("listen success\n");
// 4接受请求
// 4.1定义结构体 接收客户端信息
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin);
// 定义进称号;
pid_t pid = -1;
int newfd = -1;
while (1) {
if ((newfd = accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1) {
perror("accept error");
return -1;
}
printf("[%s:%d] 连接成功,newfd = %d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
pid = fork();
// 父进程接收请求
if (pid > 0) {
close(newfd);
}
// 子进程回应
else if (pid == 0) {
close(sfd);
dows(newfd, cin);
close(newfd);
exit(EXIT_SUCCESS);
} else {
perror("fork error");
return -1;
}
}
close(sfd);
return 0;
}
2.用多线程完成TCP并发服务器
#include
#define PORT 9999
#define IP "192.168.125.14"
//定义传参的结构体
struct phtread_ds
{
int newfd;
struct sockaddr_in cin;
};
// 线处理函数
void* dows(void* arg)
{
//分解结构体
int newfd = ((struct phtread_ds *)arg)->newfd;
struct sockaddr_in cin = ((struct phtread_ds *)arg)->cin;
// 5收发数据
char rbuf[128] = "";
while (1) {
bzero(rbuf, sizeof(rbuf));
int res = 0;
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);
}
pthread_exit(NULL);
}
int main(int argc, const char* argv[])
{
// 1创建套接字文件
int sfd = -1;
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket perror");
return -1;
}
//端口号快速重用
int reuse = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
{
perror("setsockopt error");
return -1;
}
// 2绑定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");
// 3监听
if (listen(sfd, sizeof(sin)) == -1) {
perror("listen error");
return -1;
}
printf("listen success\n");
// 4接受请求
// 定义结构体 接收客户端信
struct sockaddr_in cin;
socklen_t socklen = sizeof(cin);
int newfd = -1;
// 定义线程号
pthread_t tid = -1;
while (1) {
if ((newfd = accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1) {
perror("accept error");
return -1;
}
printf("[%s:%d] 连接成功,newfd = %d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
struct phtread_ds info={newfd,cin};
if (pthread_create(&tid, NULL, dows, &info) != 0) {
perror("create error");
return -1;
}
}
pthread_detach(tid);
return 0;
}
3.机械臂项目
#include
#define SERPORT 8888
#define SERIP "192.168.125.247"
int main(int argc, const char* argv[])
{
// 1创建用于通信的套接子
int cfd = -1;
if ((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error");
return -1;
}
// 2绑定或不绑定
// 3连接服务器
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(SERPORT);
sin.sin_addr.s_addr = inet_addr(SERIP);
// 3.2
if (connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
perror("connect error");
return -1;
}
printf("success\n");
// 4收发
//红色臂
char rbuf[5] = { 0xff, 0x02, 0x00, 0x00, 0xff };
send(cfd, rbuf, sizeof(rbuf), 0);//初始化
//蓝色臂
unsigned char bbuf[5] = { 0xff, 0x02, 0x01, 0x00, 0xff };
send(cfd, bbuf, sizeof(bbuf), 0);//初始化
char value = 0;
while (1) {
value = getchar();
switch (value) {
case 'W':
case 'w': {
rbuf[3] += 2;//增大红色臂角度
if (rbuf[3] >= 90) {
rbuf[3] = 90;
}
send(cfd, rbuf, sizeof(rbuf), 0);
break;
}
case 'S':
case 's': {
rbuf[3] -= 2;//减小
if (rbuf[3] <= -90) {
rbuf[3] = -90;
}
send(cfd, rbuf, sizeof(rbuf), 0);
break;
}
case 'A':
case 'a': {
bbuf[3] += 5;//增大蓝色臂角度
if (bbuf[3] >= 180) {
bbuf[3] = 180;
}
send(cfd, bbuf, sizeof(bbuf), 0);
break;
}
case 'D':
case 'd': {
bbuf[3] -= 5;//减小
if (bbuf[3] <= 0) {
bbuf[3] = 0;
}
send(cfd, bbuf, sizeof(bbuf), 0);
break;
}
}
}
// 关闭
close(cfd);
return 0;
}