IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【Linux】pc与Linux开发板实现TCP Socket通信 -> 正文阅读

[网络协议]【Linux】pc与Linux开发板实现TCP Socket通信


题目要求

利用TCP Socket实现PC机与目标板的通讯,目标板作为服务端,服务端按要求给两个客户端传送文件。
作业要求:
1)交电子文档,需要源代码。
2)上机演示

一、软硬件准备

1、硬件准备

Linux开发箱

2、软件准备

Ubuntu
VMware
超级终端

二、编译生成可执行文件

1、新建server.c并gcc编译生成fuwuqi

此过程参考上一篇文章,略

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <pthread.h>
 
#define portnum 12345
#define FILE_SIZE 500 
#define BUFFER_SIZE 1024
 
void *net_thread(void * fd);
 
int main()
{
	//初始化套接字
	int server_fd=socket(AF_INET,SOCK_STREAM,0);
	if(-1==server_fd)
	{
		perror("socket");
		exit(1);
	}
	//绑定端口和ip;
	struct sockaddr_in server_addr;   //struct sockaddr_in为结构体类型 ,server_addr为定义的结构体   
	server_addr.sin_family=AF_INET;   //Internet地址族=AF_INET(IPv4协议) 
	server_addr.sin_port=htons(portnum);  //将主机字节序转化为网络字节序 ,portnum是端口号
	(server_addr.sin_addr).s_addr=htonl(INADDR_ANY);//IP地址
	if(-1==bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr)))  //套接字与端口绑定
	{
		perror("bind");
		exit(6);
	}
	//开启监听
	if(-1==listen(server_fd,5)) //5是最大连接数,指服务器最多连接5个用户
	{
		perror("listen");
		exit(7);
	}
	
	while(1)
	{
		struct sockaddr_in client_addr;
		int size=sizeof(client_addr);
		int new_fd=accept(server_fd,(struct sockaddr *)&client_addr,&size);  //server_fd服务器的socket描述字,&client_addr指向struct sockaddr *的指针,&size指向协议地址长度指针
 
		if(-1==new_fd)
		{
			perror("accept");
			continue;       //进行下一次循环
		}
		printf("accept client ip:%s:%d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);
		//inet_ntoa将一个十进制网络字节序转换为点分十进制IP格式的字符串。
		
		printf("new_fd=%d\n",new_fd);
		
		// 打开文件,存入客户端的文件描述符
	    FILE *file_fp = fopen("01.file_fp", "w+"); 
        if(NULL == file_fp) 
        { 
             printf(" open 01.file_fp failure\n" ); 
             exit(1); 
        } 
	    else 
	    {
		     int a=new_fd;
		     fprintf(file_fp,"%d\n",new_fd);
		     fclose(file_fp);
	    }
			
		int pthread_id;
		int ret = pthread_create((pthread_t *)&pthread_id,NULL,net_thread,(void *)&new_fd);
		if(-1==ret)
		{
			perror("pthread_create");
			close(new_fd);
			continue;
		}
		
	}
	close(server_fd);
	return 0;
 
}
 
 
 
void *net_thread(void * fd)
{
	pthread_detach(pthread_self()); //线程分离
	int new_fd=*((int *)fd);
	int file2_fp;
	
	while(1)
	{
		// recv函数接收数据到缓冲区buffer中 
        char buffer[BUFFER_SIZE];
        memset( buffer,0, sizeof(buffer) );		
        if(read(new_fd, buffer, sizeof(buffer)) < 0) 
        { 
           perror("Server Recieve Data Failed:"); 
           break; 
        } 
		
        // 然后从buffer(缓冲区)拷贝到file_name中 
        char file_name[FILE_SIZE]; 
		memset( file_name,0, sizeof(file_name) );	
        strncpy(file_name, buffer, strlen(buffer)>FILE_SIZE?FILE_SIZE:strlen(buffer)); 
		memset( buffer,0, sizeof(buffer) );
        printf("%s\n", file_name); 
		
		if( strcmp(file_name,"null")==0 )
	    {
		   break;
		   close(new_fd);
	    }
		
		  // 打开文件并读取文件数据 
         file2_fp = open(file_name,O_RDONLY,0777); 
         if(file2_fp<0) 
         { 
            printf("File:%s Not Found\n", file_name); 
         } 
         else 
         { 
            int length = 0; 
			memset( buffer,0, sizeof(buffer) );
            // 每读取一段数据,便将其发送给客户端,循环直到文件读完为止 
            while( (length = read(file2_fp, buffer, sizeof(buffer))) > 0  )    
            {   
                if( write(new_fd, buffer, length) < 0) 
                { 
                    printf("Send File:%s Failed.\n", file_name); 
                    break; 
                } 
                memset( buffer,0, sizeof(buffer) );
            } 
              // 关闭文件 
              close(file2_fp); 
              printf("File:%s Transfer Successful!\n", file_name); 
         }   
	}
	close(new_fd);
}

2.新建client.c并gcc生成kehu

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
 
#define portnum 12345
#define FILE_SIZE 500 
#define BUFFER_SIZE 1024
 
int sendfile(int sockfd);
 
int main()
{
	char name[30]={0};
	printf("请输入服务器的主机名或者ip\n");
	scanf("%s",name);
	struct hostent *h;
	//获取服务器信息
	h=gethostbyname(name);
	if(NULL==h)
	{
		perror("geyhostbyname");
		exit(1);
	}
	//初始化套接字
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(-1==sockfd)
	{
		perror("socket");
		exit(2);
	}
	struct sockaddr_in server_addr;
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(portnum);
	server_addr.sin_addr=*((struct in_addr *)h->h_addr_list[0]);
	if(-1==connect(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr)))
	{
		perror("connect");
		exit(3);
	}
	
	while(1)
	{
		
	sendfile(sockfd);
 
    }
	return 0;
	
}
int sendfile(int sockfd)
{
    // 输入文件名 并放到缓冲区buffer中等待发送 
	int file_fp;
    char file_name[FILE_SIZE];  
	memset( file_name,0, sizeof(file_name) );
    printf("Please Input File Name On Server:   "); 
    scanf("%s", file_name); 
   
    char buffer[BUFFER_SIZE]; 
    memset( buffer,0, sizeof(buffer) );
    strncpy(buffer, file_name, strlen(file_name)>sizeof(buffer)?sizeof(buffer):strlen(file_name)); 
     
    // 向服务器发送buffer中的数据 
    if(write(sockfd, buffer, sizeof(buffer)) < 0) 
    { 
       perror("Send File Name Failed:"); 
       exit(1); 
    } 
	
	if( strcmp(file_name,"null")==0 )
	{
		exit(1);
		close(sockfd);
	}	
	 // 打开文件,准备写入 
     file_fp = open(file_name,O_CREAT|O_RDWR,0777); 
     if( file_fp<0 ) 
     { 
         printf("File:\t%s Can Not Open To Write\n", file_name); 
         exit(1); 
     } 
   
     // 从服务器接收数据到buffer中 
     // 每接收一段数据,便将其写入文件中,循环直到文件接收完并写完为止 
    int length = 0; 
	memset( buffer,0, sizeof(buffer) );
   
    while((length = read(sockfd, buffer, sizeof(buffer))) > 0) 
    { 
        if( write( file_fp, buffer, length ) < length) 
        { 
            printf("File:\t%s Write Failed\n", file_name); 
            break; 
        } 
		if(length < sizeof(buffer))
		{
			break;
		}
        memset( buffer,0, sizeof(buffer) );
    } 
	 
	// 接收成功后,关闭文件,关闭socket 
     printf("Receive File:\t%s From Server IP Successful!\n", file_name); 
     close(file_fp); 	
}

运行并传输文件

将fuwuqi传入Linux开发板并执行
将kehu在VMware中执行
执行结果:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:34:02  更:2021-08-04 11:35:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 15:37:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码