gec6818开发板和Ubuntu之间实现单向或双向TCP网络通信

TCP单向网络通信:

服务器端代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*
    tcp单向通信--》服务器的代码
    客户端键盘输入内容发送给服务器
*/
int main()
{
    
    
    int tcpsock;
    int ret;
    char rbuf[100];
    
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=inet_addr("192.168.22.5"); //女朋友(服务器)自己的ip
    bindaddr.sin_port=htons(20000); //女朋友(服务器)的端口号
    
    //定义ipv4地址体变量存放客户端的ip和端口号
    struct sockaddr_in boyaddr;
    int addrsize=sizeof(boyaddr);
    
    //创建tcp套接字
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
    
    
        perror("创建tcp套接字失败!\n");
        return -1;
    }
    
    //绑定女朋友(服务器)自己的ip和端口号
    ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
    
    
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //监听
    ret=listen(tcpsock,5);
    if(ret==-1)
    {
    
    
        perror("监听失败!\n");
        return -1;
    }
    printf("旧的套接字(监听套接字)是:%d\n",tcpsock);
    printf("服务器的代码阻塞在accept位置了!\n");
    //接收客户端的连接请求
    ret=accept(tcpsock,(struct sockaddr *)&boyaddr,&addrsize);  
    if(ret==-1)
    {
    
    
        perror("接收连接请求失败了!\n");
        return -1;
    }
    printf("有一个客户端连接成功了,产生的新套接字(已连接套接字)是:%d\n",ret);
    
    //循环接收客户端发送过来的内容
    while(1)
    {
    
    
        bzero(rbuf,100);
        //接收客户端发过来的信息
        read(ret,rbuf,100);
        printf("客户端发送过来的内容是:%s\n",rbuf);
    }
    
    //关闭套接字
    close(tcpsock);
    close(ret);
    return 0;
}

客户端代码:

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

/*
    tcp单向通信--》客户端的代码
    客户端键盘输入内容发送给服务器
*/
int main()
{
    
    
    int tcpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=inet_addr("192.168.22.5"); //客户端自己的ip
    bindaddr.sin_port=htons(10000); //客户端的端口号
    
    //定义ipv4地址体变量存放女朋友(服务器)的ip和端口号
    struct sockaddr_in girladdr;
    bzero(&girladdr,sizeof(girladdr));
    girladdr.sin_family=AF_INET;
    girladdr.sin_addr.s_addr=inet_addr("192.168.22.5"); //服务器的ip
    girladdr.sin_port=htons(20000); //服务器的端口号
    
    //创建tcp套接字
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
    
    
        perror("创建tcp套接字失败!\n");
        return -1;
    }
    
    //绑定客户端自己的ip和端口号
    ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
    
    
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //拨号连接服务器
    ret=connect(tcpsock,(struct sockaddr *)&girladdr,sizeof(girladdr));
    if(ret==-1)
    {
    
    
        perror("连接失败了!\n");
        return -1;
    }
    
    //循环从键盘输入内容发送给服务器
    while(1)
    {
    
    
        bzero(sbuf,100);
        printf("请输入要发送给服务器的信息!\n");
        scanf("%s",sbuf);
        //发送给服务器
        write(tcpsock,sbuf,strlen(sbuf));
    }
    
    //关闭套接字
    close(tcpsock);
    return 0;
    
}

TCP双向网络通信:

服务器端代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
/*
    多线程实现tcp双向通信
    服务器的代码
*/
int newsock;
//线程的任务函数--》专门发送信息给客户端
void *sendmsgtoclient(void *arg)
{
    
    
    char sbuf[100];
    while(1)
    {
    
    
        bzero(sbuf,100);
        printf("请输入要发送给客户端的信息!\n");
        scanf("%s",sbuf);
        write(newsock,sbuf,strlen(sbuf));
    }
    
}
int main()
{
    
    
    int tcpsock;
    int ret;
    char rbuf[100];
    pthread_t id;
    
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=inet_addr("172.2.1.10"); //女朋友(服务器)自己的ip
    bindaddr.sin_port=htons(20000); //女朋友(服务器)的端口号
    
    //定义ipv4地址体变量存放客户端的ip和端口号
    struct sockaddr_in boyaddr;
    int addrsize=sizeof(boyaddr);
    
    //创建tcp套接字
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
    
    
        perror("创建tcp套接字失败!\n");
        return -1;
    }
    
    //绑定女朋友(服务器)自己的ip和端口号
    ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
    
    
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //监听
    ret=listen(tcpsock,5);
    if(ret==-1)
    {
    
    
        perror("监听失败!\n");
        return -1;
    }
    printf("旧的套接字(监听套接字)是:%d\n",tcpsock);
    printf("服务器的代码阻塞在accept位置了!\n");
    //接收客户端的连接请求
    newsock=accept(tcpsock,(struct sockaddr *)&boyaddr,&addrsize);  
    if(newsock==-1)
    {
    
    
        perror("接收连接请求失败了!\n");
        return -1;
    }
    printf("有一个客户端连接成功了,产生的新套接字(已连接套接字)是:%d\n",newsock);
    
    //创建一个子线程专门发送信息
    pthread_create(&id,NULL,sendmsgtoclient,NULL);
    
    //主线程专门用来接收信息
    //循环接收客户端发送过来的内容
    while(1)
    {
    
    
        bzero(rbuf,100);
        //接收客户端发过来的信息
        read(newsock,rbuf,100);
        printf("客户端发送过来的内容是:%s\n",rbuf);
    }
    
    //关闭套接字
    close(tcpsock);
    close(newsock);
    return 0;
}

客户端代码:

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

/*
    多线程实现tcp双向通信
    客户端的代码
*/
int tcpsock;

//线程的任务函数--》专门接收服务器发送过来的信息
void *recvmsgfromserver(void *arg)
{
    
    
    char rbuf[100];
    while(1)
    {
    
    
        bzero(rbuf,100);
        read(tcpsock,rbuf,100);
        printf("服务器发过来的信息是:%s\n",rbuf);
    }
}
int main()
{
    
    
    
    int ret;
    char sbuf[100];
    pthread_t id;
    
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=inet_addr("172.2.1.110"); //客户端自己的ip
    bindaddr.sin_port=htons(10000); //客户端的端口号
    
    //定义ipv4地址体变量存放女朋友(服务器)的ip和端口号
    struct sockaddr_in girladdr;
    bzero(&girladdr,sizeof(girladdr));
    girladdr.sin_family=AF_INET;
    girladdr.sin_addr.s_addr=inet_addr("172.2.1.10"); //服务器的ip
    girladdr.sin_port=htons(20000); //服务器的端口号
    
    //创建tcp套接字
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
    
    
        perror("创建tcp套接字失败!\n");
        return -1;
    }
    
    //绑定客户端自己的ip和端口号
    ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
    
    
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //拨号连接服务器
    ret=connect(tcpsock,(struct sockaddr *)&girladdr,sizeof(girladdr));
    if(ret==-1)
    {
    
    
        perror("连接失败了!\n");
        return -1;
    }
    
    //创建一个子线程用来接收信息
    pthread_create(&id,NULL,recvmsgfromserver,NULL);
    
    //主线程用来发送信息
    //循环从键盘输入内容发送给服务器
    while(1)
    {
    
    
        bzero(sbuf,100);
        printf("请输入要发送给服务器的信息!\n");
        scanf("%s",sbuf);
        //发送给服务器
        write(tcpsock,sbuf,strlen(sbuf));
    }
    
    //关闭套接字
    close(tcpsock);
    return 0;
    
}

猜你喜欢

转载自blog.csdn.net/xqmids99/article/details/132810061
今日推荐