TCP,UDP客户端服务端基本框架。 3.机械手臂客户端

文章详细介绍了C语言中TCP和UDP服务端与客户端的连接建立、数据传输,以及机械手臂客户端通过网络控制的示例代码,展示了如何使用套接字、绑定、重用地址等技术进行通信。
摘要由CSDN通过智能技术生成

1.TCP

服务端

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#define IP "192.168.124.234"
#define PORT 8999
int main(void)
{
    int lfd=socket(AF_INET,SOCK_STREAM,0);
    if(lfd<0)
    {
        fprintf(stderr,"%d",__LINE__);
        perror("socket");
        return -1;
    }
    printf("创建套接字\n");
    struct sockaddr_in sin;
    sin.sin_family=AF_INET;
    sin.sin_port=htons(PORT);
    sin.sin_addr.s_addr=inet_addr(IP);
    int reuse = 1;
    if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }
    int bi=bind(lfd,(struct sockaddr*)&sin,sizeof(sin));
    if(bi<0)
    {
        fprintf(stderr,"%d",__LINE__);
        perror("bind");
        return -1;
    }
    int m=listen(lfd,300);
    if(m<0)
    {
        fprintf(stderr,"%d",__LINE__);
        perror("bind");
        return -1;
    }
    struct sockaddr_in cin;
    socklen_t len=sizeof(cin);
    int newfd=accept(lfd,(struct sockaddr*)&cin,&len);
    if(newfd<0)
    {
        perror("accept");
        return -1;
    }
    printf("服务器连接了,ip是%s,端口是%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
    char buf[255]={0};
    while (1)
    {
        int r=recv(newfd,buf,sizeof(buf),0);
        if(r<0)
        {
            perror("recv");
            return -1;
        }
        if(r==0)
        {
            break;
        }
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        printf("%s\n",buf);
        bzero(buf,sizeof(buf));
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]='\0';
        send(newfd,buf,strlen(buf),0);
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        bzero(buf,sizeof(buf));
    }
    close(lfd);
    close(newfd);
    
    return 0;
}

客户端

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#define PORT 9999
#define IP "192.168.124.234"
int main(void)
{
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0)
    {
        fprintf(stderr, "%d", __LINE__);
        perror("socket");
        return -1;
    }
    printf("创建套接字\n");
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);
    int reuse = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }
    int bi = bind(fd, (struct sockaddr *)&sin, sizeof(sin));
    if (bi < 0)
    {
        fprintf(stderr, "%d", __LINE__);
        perror("bind");
        return -1;
    }
    // 允许端口号被快速重复使用
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(8999);
    cin.sin_addr.s_addr = inet_addr("192.168.124.234");
    int sfd = connect(fd, (struct sockaddr *)&cin, sizeof(cin));
    if (sfd < 0)
    {
        perror("connect");
        return -1;
    }
    char buf[255] = {0};
    while (1)
    {
        bzero(buf, sizeof(buf));
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = '\0';
        send(fd, buf, strlen(buf), 0);
        if (strcmp(buf, "quit") == 0)
        {
            break;
        }
        bzero(buf, sizeof(buf));
        int r = recv(fd, buf, sizeof(buf), 0);
        if (r < 0)
        {
            perror("recv");
            return -1;
        }
        if (r == 0)
        {
            break;
        }
        if (strcmp(buf, "quit") == 0)
        {
            break;
        }
        printf("%s\n", buf);
        bzero(buf, sizeof(buf));
    }
    close(fd);
    close(sfd);

    return 0;
}

2.UDP

服务端

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#define IP "192.168.124.234"
#define PORT 8999
int main()
{
    int fd=socket(AF_INET,SOCK_DGRAM,0);
    if(fd<0)
    {
        perror("socket");
        return -1;
    }
    struct sockaddr_in sin;
    sin.sin_family=AF_INET;
    sin.sin_port=htons(PORT);
    sin.sin_addr.s_addr=inet_addr(IP);
    int reuse = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }
    int bi=bind(fd,(struct sockaddr*)&sin,sizeof(sin));
    if(bi<0)
    {
        fprintf(stderr,"%d",__LINE__);
        perror("bind");
        return -1;
    }
    struct sockaddr_in cin;
    socklen_t len=sizeof(cin);
    char buf[255]={0};
    while (1)
    {
        recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&len);
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        printf("%s\n",buf);
        bzero(buf,sizeof(buf));
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf) - 1] = '\0';
        sendto(fd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin));
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        bzero(buf,sizeof(buf));
    }
    close(fd);
    
    return 0;
}

客户端

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#define IP "192.168.124.234"
#define PORT 9999
int main()
{
    int fd=socket(AF_INET,SOCK_DGRAM,0);
    if(fd<0)
    {
        perror("socket");
        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);
    int reuse = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }
    int bi=bind(fd,(struct sockaddr*)&sin,sizeof(sin));
    if(bi<0)
    {
        fprintf(stderr,"%d",__LINE__);
        perror("bind");
        return -1;
    }*/
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(8999);
    cin.sin_addr.s_addr = inet_addr("192.168.124.234");
    char buf[255]={0};
    while (1)
    {
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf) - 1] = '\0';
        sendto(fd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin));
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        bzero(buf,sizeof(buf));
        recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
        if(strcmp(buf,"quit")==0)
        {
            break;
        }
        printf("%s\n",buf);
        bzero(buf,sizeof(buf));
    }
    close(fd);
    return 0;
}

 

 3.机械手臂客户端

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/input.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
    int fd = socket(AF_INET, SOCK_STREAM, 0);//套接字
    if (fd < 0)
    {
        fprintf(stderr, "%d", __LINE__);
        perror("socket");
        return -1;
    }
    struct sockaddr_in cin;//准备要连接服务器的地址信息
    cin.sin_family = AF_INET;
    cin.sin_port = htons(8888);
    cin.sin_addr.s_addr = inet_addr("192.168.124.89");
    int sfd = connect(fd, (struct sockaddr *)&cin, sizeof(cin));
    if (sfd < 0)
    {
        perror("connect");
        return -1;
    }
    printf("链接成功\n");
    struct input_event eve;//键盘文件属性
    int cd=open("/dev/input/event1",O_RDONLY);//打开键盘文件读取内容
    if(cd<0)
    {
        perror("open");
        return -1;
    }
    char buf[5]={0xff,0x02,0,65,0xff};
    unsigned char buf2[5]={0xff,0x02,1,65,0xff};//机械手臂的协议规范
    while (1)
    {
        read(cd,&eve,sizeof(eve));//读取信息
        switch (eve.code*eve.value)//按键状态和值,依照这些来判定按得什么
        {
        case 17://红色手臂WS
            buf[3]+=5;
            if(buf[3]>90)
                buf[3]=-90;
            send(fd,buf,5,0);
            break;
        case 31:
            buf[3]-=5;
            if(buf[3]<-90)
                buf[3]=90;
            send(fd,buf,5,0);
            break;
        case 30://蓝色手臂AD
            buf2[3]-=5;
            if(buf2[3]<0)
                buf2[3]=180;
            send(fd,buf2,5,0);
            break;
        case 32:
            buf2[3]+=5;
            if(buf2[3]>180)
                buf2[3]=0;
            send(fd,buf2,sizeof(buf2),0);
            break;
        
        default:
            continue;
        }
    }
    
    //char buf[5]={0xff,0x02,0,65,0xff};
    //send(fd,buf,5,0);
    close(fd);
    close(sfd);
    close(cd);
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值