利用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. 视频分享:过五关斩六将——我要做IT面霸!

    这是我在某网站分享的网络直播课程,现在博客园分享给大家! 本视频适合以下朋友观看: 1)在校计算机及相关专业学生,希望你了解应聘的要求后来改善你的学习: 2)正在求职或打算跳槽的人士: 3)HR或公司 ...

  2. 适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )

    在一些应用中,通常会用到很多由一些常量来进行描述的状态数据,比如性别(男.女),审核(未审核.已审核)等.在数据库中一般用数字形式来存储,比如0.1等. 不好的做法 经常看到一些应用(ps:最近又看到 ...

  3. MyEclipse Servers视窗出现“Could not create the view: An unexpected exception was thrown”错误的解决办法

    打开myeclipse所在的wordspace文件夹,在下面子文件夹 .metadata\.plugins\org.eclipse.core.runtime\.settings删除 com.genui ...

  4. Android 自定义Application

    在android中 自定义Application 常用的作用是1 保存在程序运行中的全局变量 实例:public class GlobalApp extends Application{ privat ...

  5. coursera机器学习-聚类,降维,主成分分析

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  6. C++ 之 重载赋值操作符

    Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; ...

  7. AC日记——字符串位移包含问题 1.7 19

    19:字符串移位包含问题 总时间限制:  1000ms 内存限制:   65536kB 描述 对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串. 给定两个字符串 ...

  8. ADO.Net 增、删、改、查(综合练习)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 添加事件及Event对象的兼容写法

    一.事件流 事件流描述的是从页面中接受事件的顺序. IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流 1.事件冒泡 事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点) ...

  10. java 24 - 9 GUI 之 给窗体换图标、设置启动在屏幕中间、更换皮肤

    A.首先更改窗体左上角的图片 步骤一: 创建3个包,分别建立1个类 第一个是窗体的包,窗体类:设置窗体的主要布置和功能 第二个是资源包,图片:把想要改的图案拉进来 第三个是UI界面包,UI界面设计类: ...