利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件
Linux服务器端
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> #define MAX_SOCKET 100 #ifdef __cplusplus
extern "C"
{
#endif //create socket
int create_socket(int port); //accept client
int accept_client(int st); //recv message
int recv_msg(int st); #ifdef __cplusplus
}
#endif
//辅助方法
#include "pub.h" //create socket
int create_socket(int port)
{
if (port < )
{
printf("create_socket() param not correct!\n");
return -;
}
int st = socket(AF_INET, SOCK_STREAM, );
if (st < )
{
printf("socket() failed ! error message:%s\n", strerror(errno));
return -;
}
int on = ;
if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < )
{
printf("setsockopt() failed ! error message:%s\n", strerror(errno));
close(st);
return -;
}
struct sockaddr_in addr;
memset(&addr, , sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(st, (struct sockaddr *) &addr, sizeof(addr)) < )
{
printf("bind() failed ! error message:%s\n", strerror(errno));
close(st);
return -;
}
if (listen(st, MAX_SOCKET) < )
{
printf("listen() failed ! error message:%s\n", strerror(errno));
close(st);
return -;
}
return st;
} //网络地址转化字符串
void sockaddr_toa(const struct sockaddr_in *addr, char *ipaddr)
{
if (addr == NULL || ipaddr == NULL)
{
printf("sockaddr_toa() param nor correct!\n");
return;
}
unsigned char *p = (unsigned char *) &(addr->sin_addr.s_addr);
sprintf(ipaddr, "%u:%u:%u:%u", p[], p[], p[], p[]);
} //accept client
int accept_client(int st)
{
if (st < )
{
printf("accept_client() param not correct!\n");
return -;
}
struct sockaddr_in addr;
memset(&addr, , sizeof(addr));
socklen_t len = sizeof(addr);
int client_st = accept(st, (struct sockaddr *) &addr, &len);
if (client_st < )
{
printf("accept() failed ! error message :%s\n", strerror(errno));
return -;
}
char buf[] = { };
sockaddr_toa(&addr, buf);
printf("accept by %s\n", buf);
return client_st;
} //recv message
int recv_msg(int st)
{
if (st < )
{
printf("recv_msg() param not correct!\n");
return -;
}
//
char buf[] = { };
int rc = recv(st, buf, sizeof(buf), );
if (rc < )
{
printf("recv() failed ! error message:%s\n",strerror(errno));
return -;
} else if (rc == )
{
printf("client is closed!\n");
return -;
}
//open the file
FILE * pfw = NULL;
pfw = fopen(buf, "w");
if (pfw == NULL)
{
printf("fopen() failed! error message:%s\n", strerror(errno));
return -;
}
memset(buf, , sizeof(buf));
strcpy(buf, "OK");
//给客户端发送"OK"
if (send(st, buf, strlen(buf), ) <= )
{
printf("send() failed! error message:%s\n", strerror(errno));
return -;
}
while ()
{
memset(buf, , sizeof(buf));
rc = recv(st, buf, sizeof(buf), );
if (rc < )
{
printf("recv() failed ! error message:%s\n",strerror(errno));
return -;
} else if (rc == )
{
printf("client is closed!\n");
break;
}
fwrite(buf, sizeof(char), rc, pfw);
}
//关闭客户端
close(st);
printf("文件接收完毕!\n");
return ;
}
//服务器端
#include "pub.h" int main(int arg,char *args[])
{
if(arg<)
{
printf("please print one param ! \n");
return -;
}
int port=atoi(args[]);
int listen_st=create_socket(port);
if(listen_st<) return -;
int client_st=accept_client(listen_st);
if(client_st<) return -;
recv_msg(client_st);
close(listen_st);
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS=mserver.c\
pub.c
OBJS=$(SRCS:.c=.o)
EXEC=mser start:$(OBJS)
$(CC) -o $(EXEC) $(OBJS)
@echo "--------OK--------"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f $(EXEC)
QT客户端
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QTcpSocket>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QTextBrowser> class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = );
~Widget();
private:
QTcpSocket *tcpsock;
QLabel *label1,*label2,*label3;
QLineEdit *edit1,*edit2;
QPushButton *btn1;
QTextBrowser *text1;
QString filename;
void mygetfilename(const char *src,int len,char *dest);
private slots:
void btn1_click();
void myrecvdata();
}; #endif // WIDGET_H
#include "widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QMessageBox>
#include <QHostAddress> Widget::Widget(QWidget *parent)
: QWidget(parent)
{
tcpsock=new QTcpSocket(this);
connect(tcpsock,SIGNAL(readyRead()),this,SLOT(myrecvdata()));
label1=new QLabel(tr("IP地址:"));
label2=new QLabel(tr("端口号:"));
label3=new QLabel(tr("上传信息"));
edit1=new QLineEdit(); edit2=new QLineEdit();
btn1=new QPushButton(tr("文件上传"));
text1=new QTextBrowser();
connect(btn1,SIGNAL(clicked()),this,SLOT(btn1_click()));
QHBoxLayout *lay1=new QHBoxLayout();
lay1->addWidget(label1);
lay1->addWidget(edit1); QHBoxLayout *lay2=new QHBoxLayout();
lay2->addWidget(label2);
lay2->addWidget(edit2); QHBoxLayout *lay4=new QHBoxLayout();
lay4->addWidget(btn1);
lay4->addStretch(); QVBoxLayout *lay3=new QVBoxLayout(this);
lay3->addLayout(lay1);
lay3->addLayout(lay2);
lay3->addLayout(lay4);
lay3->addWidget(label3);
lay3->addWidget(text1);
} //接收信息
void Widget::myrecvdata()
{
//接收消息
char buf[]={};
if(tcpsock->bytesAvailable()>)
{
tcpsock->read(buf,sizeof(buf));
if(strncmp(buf,"OK",)==)
{
text1->append("服务器返回OK!");
//发送文件
FILE *pfr=NULL;
pfr=fopen(filename.toStdString().data(),"rb");
if(pfr==NULL)
{
QMessageBox::critical(this,tr("错误信息"),"打开文件失败!");
return;
}
int rc=;
while(!feof(pfr))
{
//
memset(buf,,sizeof(buf));
rc=fread(buf,,sizeof(buf),pfr);
//发送数据
tcpsock->write(buf,rc);
}
fclose(pfr);
pfr=NULL;
text1->append("文件发送成功!");
}
} } //获取文件名
void Widget::mygetfilename(const char *src,int len,char *dest)
{
if(src==NULL||len==||dest==NULL)
{
QMessageBox::critical(this,tr("错误信息"),"mygetfilename()参数不可以为空!");
return;
}
int i=;
for(i=len-;i>=;i--)
{
if(src[i]=='/'||src[i]=='\\')
{
strcpy(dest,src+i+);
break;
}
}
} //点击文件上传
void Widget::btn1_click()
{
//获取IP地址
QString ipaddr=edit1->text();
if(ipaddr.isEmpty())
{
QMessageBox::critical(this,tr("错误信息"),"请填写IP地址!");
return;
}
//获取端口号
QString port=edit2->text();
if(port.isEmpty())
{
QMessageBox::critical(this,tr("错误信息"),"请填写端口号!");
return;
}
filename=QFileDialog::getOpenFileName();
if(filename.isEmpty()) return;
char buf[]={};
//获取文件名
mygetfilename(filename.toStdString().data(),filename.toStdString().length(),buf);
if(strlen(buf)==)
{
QMessageBox::critical(this,tr("错误信息"),"文件格式不正确!");
return;
}
tcpsock->close();
//绑定端口号
QHostAddress *serip=new QHostAddress();
serip->setAddress(ipaddr);
tcpsock->connectToHost(ipaddr,port.toInt());
delete serip;
//发送数据
tcpsock->write(buf,strlen(buf));
text1->append("开始发送数据!");
} Widget::~Widget()
{ }

QT TCP文件上传服务器的更多相关文章

  1. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  2. TCP文件上传实现

    TCP文件上传实现 服务端: package net.study; import java.io.*; import java.net.ServerSocket; import java.net.So ...

  3. HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法

    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...

  4. scp -本地文件上传服务器,指定端口

    scp 命令可以将本地文件上传服务器,或者将服务器上的文件下载到本地, 1.  上传服务器: scp [本地文件目录]  [服务器用户名]@[服务器名]:/[服务器上文件路径] 比如 scp /Doc ...

  5. post提交/文件上传服务器修改

    第一步:修改在php5下POST文件大小的限制   1.编修php.ini   找到:max_execution_time = 30 ,这个是每个脚本运行的最长时间,单位秒,修改为: max_exec ...

  6. 使用FTPClient实现文件上传服务器

    import ch.qos.logback.classic.Logger; import org.apache.commons.net.ftp.*; import org.slf4j.LoggerFa ...

  7. andorid人员文件上传服务器的搭建(tomcat中)

    1.将.war文件复制到tomcat服务器webapps下,启动服务器即可 2.访问工程路径http://localhost:8080/FileUpload/index.jsp即可测试上传 3.测试成 ...

  8. 简单的文件上传服务器(上传到FastDFS服务器)

    现在文件服务器使用越来越多,其中FastDFS文件服务器非常出色,可以支持分布式存储,多文件系统集群和多主机备份 环境中使用的文件服务器为172.16.100.10,其中trackerd服务和stor ...

  9. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

随机推荐

  1. UITextField 的限制输入金额(可为小数的正确金额)

    要判断输入金额为正确金额的方法有两个,一个是用正则表达式,另一个就是用textfield的代理方法 有时候难免遇到这样的需求,不符合规则的金额就不让输入时,那用这种方法比较合理 如果设置输入键盘为De ...

  2. 编写可测试的JavaScript代码

    <编写可测试的JavaScript代码>基本信息作者: [美] Mark Ethan Trostler 托斯勒 著 译者: 徐涛出版社:人民邮电出版社ISBN:9787115373373上 ...

  3. LoadRunner性能测试巧匠训练营

    <LoadRunner性能测试巧匠训练营>基本信息作者: 赵强 邹伟伟 任健勇 丛书名: 实战出版社:机械工业出版社ISBN:9787111487005上架时间:2015-1-7出版日期: ...

  4. JavaScript Patterns 6.7 Borrowing Methods

    Scenario You want to use just the methods you like, without inheriting all the other methods that yo ...

  5. PHP curl https访问问题

    PHP curl https访问问题,原代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* @String url URL地址  * @Array data P ...

  6. SQL语句查询某表的所有字段及数据类型

    SQL语句查询某表的所有字段及数据类型 SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type , max_leng ...

  7. Windows7 系统 CMD命令行,点阵字体不能改变大小以及中文乱码的问题

    之前装了oracle 11g后,发现开机速度竟然奇葩的达到了3分钟.经过旁边大神指点,说是因为oracle某个(具体不清楚)服务,在断网的时候会不断的ping网络,导致速度变慢.然后就关服务呗,然后一 ...

  8. python爬取并下载麦子学院所有视频教程

    一.主要思路 scrapy爬取是有课程地址及名称 使用multiprocessing进行下载 就是为了爬点视频,所以是简单的代码堆砌 想而未实行,进行共享的方式 二.文件说明 itemsscray字段 ...

  9. Mysql 创建用户 授权

    一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...

  10. React-Native测试报告

     React-native 使用js编写android和ios程序,前端时间开始支持android,本人根据官方的教程,先安装开发环境,然后运行hello world,最后看了下官方提供的实例程序UI ...