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. Oracle Order Management DropShip Flow for R12

    Oracle Order Management DropShip Flow for R12 Email ThisBlogThis!Share to TwitterShare to FacebookSh ...

  2. 《OD学Oozie》20160807Oozie

    一.引入 MapReduce Job Hive 脚本任务 同一个业务:先后.定时调度 工作流: 定义工作流程 activity jbpm oozie: 大数据工作流定义与调度框架 专门定义与调度Map ...

  3. poj 3694 pku 3694 Network tarjan求割边 lca

    题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥.一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时.那么就可以缩点,因为如果一条边不是桥那么无论怎 ...

  4. 【第六篇】javascript显示当前的时间(年月日 时分秒 星期)

    不多说自己上代码 这是我开始学javascript写的,现在发出来 <span id="clock" ></span> function time() { ...

  5. PHP学习笔记03——函数

    <!DOCTYPE unspecified PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...

  6. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. Java 动态眨眼 EyesJPanel (整理)

    /** * Java 动态眨眼 EyesJPanel (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * 注意事项: * 1.本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档: ...

  8. AutoGenSystem

    #coding=utf-8 # # AutoGenSystem # 声明: # 该软件主要是为了解决Android系统更新时,由于版本很多,管理起来复杂,容易出错,于是采用软件 # 自动对系统软件进行 ...

  9. HDU 1496 Train Problem I 火车问题1(桟,水)

    题意: 给出两个串,串中的数字i 代表编号为i的火车进入车站的顺序,车站如桟一样,先进后出.第二个串是火车出站的顺序,问若按照第一个串那样进站,是否有可能如第二个串一样的出站顺序?火车顶多9辆,即1- ...

  10. The Robust Fuzzy C-means

    摘要: 基于FCM的在图像处理方面对噪声敏感的不足,本文通过引入空间模型建立空间模糊C均值聚类提高算法的鲁棒性,在此基础上,结合抑制式对算法进一步优化.最后,给图像加不同程度的噪声,通过MATLAB编 ...