网络编程 TCP UDP服务器

TCP服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>

#define PORT 1234            //1024~49151 
#define IP "192.168.124.70"  //ifconfig查找本机的IP地址

int main(int argc, const char *argv[])
{
    // 创建流式套接字
    int sfd = socket(AF_INET , SOCK_STREAM, 0);
    if(sfd < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("socket");
        return -1;
    }
    printf("创建流式套接字成功 sfd=%d __%d__\n",sfd,__LINE__);

    //允许端口号被快速重复使用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {                                                                          
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;

    }
    
    // 填充服务器的地址信息结构体,真实的地址信息结构提根据地址族制定
    // AF_INET ---> man 7 ip
    struct sockaddr_in sin;
    sin.sin_family       = AF_INET;         // 必须填AF_INET
    sin.sin_port         = htons(PORT);     // 端口号的网络字节序 1024~49151
    sin.sin_addr.s_addr  = inet_addr(IP);   // 服务器要运行的主机的IP的网络地址
    
    // 绑定服务器自身的地址信息---> 必须绑定
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("bind");
        return -1;
    }
    printf("服务器地址绑定成功 __%d__\n",__LINE__);

    // 将套接字设置为自动监听状态
    if(listen(sfd,128) < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("listen");
        return -1;
    }
    printf("自动监听状态设置成功 __%d__\n",__LINE__);

    struct sockaddr_in cin;  // 存储客户端信息的
    socklen_t addrlen = sizeof(cin);
    // 从已经完成链接队列的队头获取一个客户端的信息,生成一个新的文件描述符
    // accept(sfd,NULL,NULL);
    int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
    if(newfd < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("accept");
        return -1;
    }
    printf("客户端信息接收成功 __%d__\n",__LINE__);

    char buf[128];
    ssize_t res;
    while(1)
    {
        // 接收
        bzero(buf,sizeof(buf));
        res = recv(newfd, buf, sizeof(buf), 0);
        if(res < 0)
        {
            fprintf(stderr,"__%d__",__LINE__);
            perror("recv");
            return -1;
        }
        else if(0 == res)
        {
            printf("客户端下线\n");
            break;
        }
        printf("客户端:%d\n客户端发送内容:%s\n ",newfd,buf);
        // 发送
        strcat(buf,"*_*");
        if(send(newfd,buf,sizeof(buf),0) < 0)
        {
            fprintf(stderr,"__%d__",__LINE__);
            perror("send");
            return -1;
        }
        printf("服务器发送成功\n");
    }
    // 关闭文件描述符
    close(newfd);
    close(sfd);
    return 0;
}

TCP客户端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>


#define PORT 8888             
#define IP "192.168.124.70"  

int main(int argc, const char *argv[])
{
    if(argc < 3)
    {
        printf("请在命令行传入服务器的端口号和ip地址\n");
        return -1;
    }
    // 创建流式套接字
    int sfd = socket(AF_INET , SOCK_STREAM, 0);
    if(sfd < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("socket");
        return -1;
    }
    printf("创建流式套接字成功 sfd=%d __%d__\n",sfd,__LINE__);

    //允许端口号被快速重复使用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {                                                                          
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }

    //根据客户自身的地址信息,给bind函数绑定使用
    //真实地址信息结构体根据地址制定 AF_INET ---> man 7 IP
/*
    struct sockaddr_in sin;
    sin.sin_family       = AF_INET;         // 必须填AF_INET
    sin.sin_port         = htons(PORT);     // 客户端需要绑定的端口号
    sin.sin_addr.s_addr  = inet_addr(IP);   // 客户端绑定的IP地址
    
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("bind");
        return -1;
    }
    printf("客户端绑定成功 __%d__\n",__LINE__);
*/


    // 填充服务器的地址信息,给connect函数连接服务器的时候使用
    // 连接服务器
    struct sockaddr_in sin;
    sin.sin_family         = AF_INET; // 必须填充AF_INET 
    sin.sin_port           = htons(atoi(argv[1])); // 服务器绑定的端口号
    sin.sin_addr.s_addr    = inet_addr(argv[2]); //服务器绑定的IP号 
    
    if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("connect");
        return -1;
    }
    printf("连接服务器端口成功\n");

    char buf[128];
    ssize_t res;
    while(1)
    {
        // 发送

        printf("请输入发送内容:\n");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1] = '\0';

        if(send(sfd,buf,sizeof(buf),0) < 0)
        {
            fprintf(stderr,"__%d__",__LINE__);
            perror("send");
            return -1;
        }
        printf("客户端发送成功\n");

        // 接收
        bzero(buf,sizeof(buf));
        res = recv(sfd, buf, sizeof(buf), 0);
        if(res < 0)
        {
            fprintf(stderr,"__%d__",__LINE__);
            perror("recv");
            return -1;
        }
        else if(0 == res)
        {
            printf("服务器下线\n");
            break;
        }
        printf("%s\n",buf);
    }
    // 关闭文件描述符
    
    close(sfd);
    return 0;
}

图片展示

UDP服务器

#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define CLI_PORT 8888
#define CLI_IP "192.168.124.70"
int main(int argc, const char *argv[])
{
    // 创建报式套接字
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd<0)
    {
        fprintf(stderr,"line:%d ",__LINE__);
        perror("socket");
        return -1;
    }
    printf("创建报式套接字成功,sfd=%d __%d__\n",sfd,__LINE__);
    //允许端口号被快速重复使用
    int  reuse = 1;
    if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    {
        fprintf(stderr,"line:%d ",__LINE__);
        perror("setsockopt");
        return -1;
    }
    //填充服务器的地址信息结构体,真实的地址信息结构体根据地址族制定
    //AF_INET ---> man 7 IP
    struct sockaddr_in sin;
    sin.sin_family          = AF_INET; //必须填AF_INET
    sin.sin_port            = htons(CLI_PORT);  // 端口号的网络字节序 1024~49151
    sin.sin_addr.s_addr     =inet_addr(CLI_IP); // 服务器要运行的主机的IP的网络地址
    //ifconfig查找本机的IP地址
    //绑定服务器自身的地址信息--->必须绑定
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        fprintf(stderr,"line:%d ",__LINE__);
        perror("bind");
        return -1;
    }
    printf("服务器绑定成功 __%d__\n",__LINE__);
    char buf[128]="";
    struct sockaddr_in cin;
    socklen_t addrlen=sizeof(cin);
    while(1)
    {
        bzero(buf,sizeof(buf));
        //接收
        if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*) &cin , &addrlen) < 0 )
        {
            fprintf(stderr,"line:%d ",__LINE__);
            perror("bind");
            return -1;
        }
        printf("[%s:%d] : %s __%d__\n",\
                inet_ntoa(cin.sin_addr),htons(cin.sin_port),buf,__LINE__);

        //发送--->谁发给我,我发还给谁
        strcat(buf,"*_*");
        if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0)
        {
            fprintf(stderr,"line:%d ",__LINE__);
            perror("bind");
            return -1;
        }
        printf("服务器发送成功\n");
    }
    
    close(sfd);
    return 0;
}
 

UDP客户端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>


#define SER_PORT 8888             
#define SER_IP "192.168.124.70" 

#define CLI_PORT 6666
#define CLI_IP "192.168.124.70"

int main(int argc, const char *argv[])
{
    // 创建流式套接字
    int sfd = socket(AF_INET , SOCK_DGRAM, 0);
    if(sfd < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("socket");
        return -1;
    }
    printf("创建流式套接字成功 sfd=%d __%d__\n",sfd,__LINE__);

    //允许端口号被快速重复使用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {                                                                          
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }

    // 填充客户端的地址信息
    struct sockaddr_in sin;
    sin.sin_family         = AF_INET; // 必须填充AF_INET 
    sin.sin_port           = htons(CLI_PORT); // 客户端绑定的端口号1024~49151
    sin.sin_addr.s_addr    = inet_addr(CLI_IP); //客户端绑定的IP号 
    
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("bind");
        return -1;
    }
    printf("bind [%s:%d]\n",CLI_IP,CLI_PORT);
    
    struct sockaddr_in tin;
    tin.sin_family         = AF_INET; // 必须填充AF_INET 
    tin.sin_port           = htons(SER_PORT); // 服务器绑定的端口号
    tin.sin_addr.s_addr    = inet_addr(SER_IP); //服务器绑定的IP号 
    

    char buf[128];
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);  // 存储数据包发送方的地址信息

    while(1)
    {
        printf("请输入发送内容:\n");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1] = '\0';

        if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&tin,sizeof(tin)) < 0)
        {
            fprintf(stderr,"__%d__",__LINE__);
            perror("sendto");
            return -1;
        }
        printf("客户端发送成功\n");

        // 接收
        bzero(buf,sizeof(buf));
        if(recvfrom(sfd, buf, sizeof(buf), 0,(struct sockaddr*)&cin,&addrlen)<0)
        {
            fprintf(stderr,"__%d__",__LINE__);
            perror("recvfrom");
            return -1;
        }

        printf("%s\n",buf);
    }
    // 关闭文件描述符

    close(sfd);
    return 0;
}

图片展示

机械臂

代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/input.h>
#include <head.h>

#define PORT 8888             
#define IP "192.168.124.12"  

int main(int argc, const char *argv[])
{
    // 创建流式套接字
    int sfd = socket(AF_INET , SOCK_STREAM, 0);
    if(sfd < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("socket");
        return -1;
    }
    printf("创建流式套接字成功 sfd=%d __%d__\n",sfd,__LINE__);

    //允许端口号被快速重复使用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {                                                                          
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("setsockopt");
        return -1;
    }


    // 填充服务器的地址信息,给connect函数连接服务器的时候使用
    // 连接服务器
    struct sockaddr_in sin;
    sin.sin_family         = AF_INET; // 必须填充AF_INET 
    sin.sin_port           = htons(PORT); // 服务器绑定的端口号
    sin.sin_addr.s_addr    = inet_addr(IP); //服务器绑定的IP号 
    
    if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        fprintf(stderr, "line:%d  ", __LINE__);
        perror("connect");
        return -1;
    }
    printf("连接服务器端口成功\n");

    // 打开键盘驱动文件:/dev/input/event1
    int fd = open("/dev/input/event1",O_RDONLY);
    if(fd <0)
    {
        perror("open");
        return -1;
    }

    struct input_event ev;

    char buf[5] ={0xff,0x02,0x00,-90,0xff} ;
    unsigned char arr[5] = {0xff,0x02,0x01,0,0xff};

    if(send(sfd,buf,sizeof(buf),0) < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("send");
        return -1;
    }

    else if(send(sfd,arr,sizeof(arr),0) < 0)
    {
        fprintf(stderr,"__%d__",__LINE__);
        perror("send");
        return -1;
    }
    printf("客户端发送成功\n");

    while(1)
    {
        if(read(fd,&ev,sizeof(ev))  < 0)
        {
            perror("read");
            return -1;
        }
            switch(ev.code*ev.value)
            {
            case 17:
                buf[3] += 5;   // 控制红色手臂++  'w'
                if(buf[3] > 90)
                    buf[3] = 90;
                break;
            case 31:
                buf[3] -= 5;    // 控制红色手臂-- 's'
                if(buf[3] <- 90)
                    buf[3] = 90;
                break;

            case 30:
                arr[3] -= 5;  // 控制蓝色手臂-- 'a'
                if(arr[3] <0)
                    arr[3] = 0;
                break;
            case 32:
                arr[3] += 5;  // 控制蓝色手臂++ 'd'
                if(arr[3] > 180)
                    arr[3] = 180;
                break;

            default:
                continue;
            }
            if(send(sfd,buf,sizeof(buf),0) <0)
            {
                fprintf(stderr,"__%d__",__LINE__);
                perror("send");
                return -1;
            }
            else if(send(sfd,arr,sizeof(arr),0) <0)
            {
                fprintf(stderr,"__%d__",__LINE__);
                perror("send");
                return -1;
            }

    }
        // 关闭文件描述符

    close(sfd);
    return 0;
}

图片展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值