aaarticlea/png;base64,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" alt="" />

测试Mellanox卡硬件性能程序

 //本文件是服务器的代码
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/
#define HELLO_WORLD_SERVER_PORT 6666
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv)
{
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
int server_socket = socket(PF_INET,SOCK_STREAM,);
if( server_socket < )
{
printf("Create Socket Failed!");
exit();
} //把socket和socket地址结构联系起来
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit();
} //server_socket用于监听
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf("Server Listen Failed!");
exit();
}
while () //服务器端要一直运行
{
//定义客户端的socket地址结构client_addr
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr); //接受一个到server_socket代表的socket的一个连接
//如果没有连接请求,就等待到有连接请求--这是accept函数的特性
//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
//new_server_socket代表了服务器和客户端之间的一个通信通道
//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < )
{
printf("Server Accept Failed!\n");
break;
} char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
length = recv(new_server_socket,buffer,BUFFER_SIZE,);//这里先接收客户端发来的要获取的文件名
if (length < )
{
printf("Server Recieve Data Failed!\n");
break;
}
char file_name[FILE_NAME_MAX_SIZE+];
bzero(file_name, FILE_NAME_MAX_SIZE+);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
// int fp = open(file_name, O_RDONLY);
// if( fp < 0 )
FILE * fp = fopen(file_name,"r");
if(NULL == fp )
{
printf("File:\t%s Not Found\n", file_name);
}
else
{
bzero(buffer, BUFFER_SIZE);
int file_block_length = ;
// while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)
while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>)
{
printf("file_block_length = %d\n",file_block_length);
//发送buffer中的字符串到new_server_socket,实际是给客户端
if(send(new_server_socket,buffer,file_block_length,)<)
{
printf("Send File:\t%s Failed\n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
} //这段代码是循环读取文件的一段数据,在循环调用send,发送到客户端,这里强调一点的TCP每次接受最多是1024字节,多了就会分片,因此每次发送时尽量不要超过1024字节。
// close(fp);
fclose(fp);
printf("File:\t%s Transfer Finished\n",file_name);
}
//关闭与客户端的连接
close(new_server_socket);
}
//关闭监听用的socket
close(server_socket);
return ;
}
 //本文件是客户机的代码
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/ #define HELLO_WORLD_SERVER_PORT 6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv)
{
if (argc != )
{
printf("Usage: ./%s ServerIPAddress\n",argv[]);
exit();
} //设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0
client_addr.sin_family = AF_INET; //internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(); //0表示让系统自动分配一个空闲端口
//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
int client_socket = socket(AF_INET,SOCK_STREAM,);
if( client_socket < )
{
printf("Create Socket Failed!\n");
exit();
}
//把客户机的socket和客户机的socket地址结构联系起来
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit();
} //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[],&server_addr.sin_addr) == ) //服务器的IP地址来自程序的参数
{
printf("Server IP Address Error!\n");
exit();
}
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < )
{
printf("Can Not Connect To %s!\n",argv[]);
exit();
} char file_name[FILE_NAME_MAX_SIZE+];
bzero(file_name, FILE_NAME_MAX_SIZE+);
printf("Please Input File Name On Server:\t");
scanf("%s", file_name); char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
//向服务器发送buffer中的数据
send(client_socket,buffer,BUFFER_SIZE,); // int fp = open(file_name, O_WRONLY|O_CREAT);
// if( fp < 0 )
FILE * fp = fopen(file_name,"w");
if(NULL == fp )
{
printf("File:\t%s Can Not Open To Write\n", file_name);
exit();
} //从服务器接收数据到buffer中
bzero(buffer,BUFFER_SIZE);
int length = ;
while( length = recv(client_socket,buffer,BUFFER_SIZE,)) //循环接收,再写到文件
{
if(length < )
{
printf("Recieve Data From Server %s Failed!\n", argv[]);
break;
}
// int write_length = write(fp, buffer,length);
int write_length = fwrite(buffer,sizeof(char),length,fp);
if (write_length<length)
{
printf("File:\t%s Write Failed\n", file_name);
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[]); close(fp);
//关闭socket
close(client_socket);
return ;
}

C 基于socket实现简单的文件传输的更多相关文章

  1. Windows下通过socket进行字符串和文件传输

    今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...

  2. Python的网络编程[5] -> BOOTP + TFTP + FTP -> 实现一个简单的文件传输流程

    BOOTP-TFTP-FTP 目录 文件传输流程 服务器建立过程 客户端建立过程 1 文件传输流程 / File Transfer Flow 利用BOOTP,TFTP,FTP三种传输协议,建立起客户端 ...

  3. 网络编程 - socket通信/粘包/文件传输/udp - 总结

    socket通信 1.简单的套接字通信 import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bin ...

  4. 基于TCP协议的大文件传输(粘包问题处理)

    基于TCP的大文件上传服务端实现 # 服务端 # -*- coding: utf-8 -*- from socket import * import json, struct server = soc ...

  5. C#基于Socket的简单聊天室实践

    序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...

  6. 标准C实现基于TCP/IP协议的文件传输

    上学期集成程序设计的课堂作业,对于理解TCP/IP实现还是挺有帮助的. TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如 ...

  7. 标准C语言实现基于TCP/IP协议的文件传输

    TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下:  1.Socket系统调用  为了进行网络I/O,服务器和客户机两 ...

  8. Java 简单TCP文件传输

    服务端 package TCP; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt ...

  9. 基于socket实现上传文件

    基于socket实现文件上传 客户端代码: #!/usr/bin/env python # -*- coding:utf-8 -*- """ 这个是实现上传文件 首先让客 ...

随机推荐

  1. [51NOD1127]最短的包含字符串(尺取法)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127 思路:尺取法,一开始我考虑更新右指针,直到遇到一个和l指 ...

  2. java.util.logging.Logger使用详解

    一.创建Logger对象   static Logger getLogger(String name)           为指定子系统查找或创建一个 logger. static Logger ge ...

  3. hdfs工作原理

    一.NameNode和DataNode (1)NameNode NameNode的作用是管理文件目录结构,是管理数据节点的.NameNode维护两套数据:一套是文件目录与数据块之间的关系,另一套是数据 ...

  4. Ubuntu 14.04搭建简单git服务器

    /****************************************************************************** * Ubuntu 14.04搭建简单gi ...

  5. OK335xS Linux kernel check clock 24M hacking

    /****************************************************************************** * OK335xS Linux kern ...

  6. postgresql - mac 启动 关闭 postgresql

    /Library/PostgreSQL/9.3/bin/pg_ctl -D /Library/PostgreSQL/9.3/data stop /Library/PostgreSQL/9.3/bin/ ...

  7. 【自动化测试】Selenium处理富文本框

    http://blog.csdn.net/fudax/article/details/8089404 selenium处理富文本框,日历控件等 调用JS修改value值 document.getEle ...

  8. PPTP模式跟L2TP模式有什么不同

    使用VPN的时候经常会看到商家说支持PPTP模式和L2TP模式,但是许多朋友都不知道有什么区别,该用哪一个,下面给你们讲讲: 1).PPTP协议是点对点隧道协议:其将控制包与数据包分开,控制包采用TC ...

  9. Struts2配置之Struts.properties

    Struts 2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等.除此之 外,Struts 2框架还包含     s ...

  10. .net core 中的序列化和反序列化

    学习博客:http://www.voidcn.com/blog/dujingjing1230/article/p-1204454.html