writeDatagram(datag" />
搜档网
当前位置:搜档网 › Qt图像udp通信等学习

Qt图像udp通信等学习

Qt图像udp通信等学习
Qt图像udp通信等学习

qt4使用QUdpSocket发送数据报datagrams

2013-07-26 | 分类: QT | 标签:| 浏览(0)

UDP服户端绑定广播[喝小酒的网摘]https://www.sodocs.net/doc/ff348065.html,/a/11512.htm

udpSocket = new QUdpSocket(this);

QByteArray datagram = "https://www.sodocs.net/doc/ff348065.html,";

udpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454);

udpSocket->bind(QHostAddress("192.168.1.104"), 45454);

UDP客户端广播

QUdpSocket *udpsocket1 = new QUdpSocket(this);

QByteArray datagram = "https://www.sodocs.net/doc/ff348065.html,";

udpsocket1->writeDatagram(datagram.data(),datagram.size(), QHostAddress::Broadcast,ui->spinBox->text().toInt());

UDP客户端发送到指定IP

QUdpSocket *udpsocket1 = new QUdpSocket(this);

QByteArray datagram = "https://www.sodocs.net/doc/ff348065.html,";

udpsocket1->writeDatagram(datagram.data(),datagram.size(), QHostAddress("192.168.1.104"),ui->spinBox->text().toInt());

收数据

connect(udpsocket, SIGNAL(readyRead()), this,

SLOT(readPendingDatagrams()));

while (udpsocket->hasPendingDatagrams())

{

QByteArray datagram;

datagram.resize(udpsocket->pendingDatagramSize());

QHostAddress sender;

quint16 senderPort;

udpsocket->readDatagram(datagram.data(), datagram.size(), &sender,

&senderPort);

qDebug()<

}

[喝小酒的网摘]https://www.sodocs.net/doc/ff348065.html,/a/11512.htm

转载自[https://www.sodocs.net/doc/ff348065.html,]喝小酒的网摘及本文链接地

址:https://www.sodocs.net/doc/ff348065.html,/a/11512.htm

相关文章

?Qt网络之UDP网络基础与示例学习在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。这里我们还要了解一个名词Socket,也就是常说的“套接字”。Socket简单地说,就是一个IP地址加一个port端口。因为我们要传输数据,就要知道往哪个机子上传送,而IP地址确定了一台主机,但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个?QT点击按钮打开一个网址URL直接上代码

QDesktopServices::openUrl(QUrl(QLatin1String("https://www.sodocs.net/doc/ff348065.html,")));

第一次打开的时候好像要比较长时间,第二次打开时就会很快速。

bool QDesktopServices::openUrl ( const QU

?Qt学习之路(54): 自定义拖放数据对象前面的例子都是使用的系统提供的拖放对象QMimeData 进行拖放数据的存储,比如使用QMimeData::setText() 创建文本,使用QMimeData::urls() 创建URL 对象。但是,如果你希望使用一些自定义的对象作为拖放数据,比如自定义类等等,单纯使用QMimeData 可能就没有那么容易了。为了实现这种操作,我们可以从下面三种实现方式中选择一个:

?Qt学习之路(53): 拖放技术之二接着上次的说,上次说到了拖放技术,今天依然是一个例子,同样是来自《C++ GUI Programming with Qt 4, 2nd Edition》的。这次的demo 还算是比较实用:实现的是两个list 之间的数据互拖。在很多项目中,这一需求还是比较常见的吧!下面也就算是抛砖引玉了啊!projectlistwidget.h #ifndef PROJECTLIST

?Qt学习之路(52): 拖放技术之一拖放Drag and Drop,有时又被称为DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制,并且,操作系统与应用程序之间进行剪贴板的内容交换,也可以被认为是DnD 的一部分。DnD 其实是由两部分组成的:Drag 和Drop。Drag 是将被拖放对象“拖动”,Drop 是将被拖放对象&ldquo

发送(客户请求发送数据)

很简单,仅需QUdpSocket 的writeDatagram函数即可

[cpp]view plaincopy

1.void Widget::on_pushButton_clicked()

2.{ QUdpSocket *sender;

3. sender = new QUdpSocket(this);

4. QByteArray datagram = "hello world!";

5. sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress("192.168.1.100"),45454);

6.//sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,45454);

7.// sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::LocalHost,45454);

8.delete sender;

9.}

接收(服务器端监听)

使用QUdpSocket 的bind函数监听某个端口

当监听的端口有数据到达时,QUdpSocket 的信号readyRead()就emit,然后在对应的槽函数里使用QUdpSocket 的readDatagram读取数据

void QIODevice::readyRead () [signal]

This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.

readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true).

Note for developers implementing classes derived from QIODevice: you should always emit readyRead() when new data has arrived (do not emit it only because there's data still to be read in your buffers). Do not emit readyRead() in other conditions.

[cpp]view plaincopy

1.private:

2. QUdpSocket *receiver;

3.private slots:

4.void processPendingDatagram();

[cpp]view plaincopy

1.receiver = new QUdpSocket(this);

2.receiver->bind(45454,QUdpSocket::ShareAddress);

3.connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));

[cpp]view plaincopy

1.void Widget::processPendingDatagram() //处理等待的数据报

2.{

3.while(receiver->hasPendingDatagrams()) //拥有等待的数据报

4. {

5. QByteArray datagram; //拥于存放接收的数据报

6. datagram.resize(receiver->pendingDatagramSize());

7.//让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据

8. receiver->readDatagram(datagram.data(),datagram.size());

9.//接收数据报,将其存放到datagram中

10. ui->label->setText(datagram);

11.//将数据报内容显示出来

12. }

13.}

用wireshark监听xp 192.168.1.100和虚拟机fedora 192.168.1.103之间的udp数据包,如下

hello world

xp 192.168.1.100------------------------->fedora 192.168.1.103

(wireshark操作:capture->Options里选择要监视的网卡,然后点Start。可以选择capture/capture filters然后选择udp only过滤一下)

嗯,这个QImage的问题研究好久了,有段时间没用,忘了,已经被两次问到了,突然有点解释不清楚,我汗颜,觉得有必要重新总结下了,不然无颜对自己了。

图像的数据是以字节为单位保存的,每一行的字节数必须是4的整数倍,不足的补0。

(因为我们使用的是32操作系统,因此数据是按照32位对齐的,所以每行的字节数必须是4的整数倍也就是说每行的数据位必须是32位的整数倍。)这里是按照我的理解的,貌似错了,修正一下,最近在看数据对齐,这段话先忽略了,没有删掉,是因为,想留个足迹,等我找到合适的答案再贴上来。不过,图像的数据确实是按32位对齐的。

如果不是整数倍,则根据公式: W = ( w * bitcount + 31 )/32 * 4;

注: w是图像的宽度,bitcount是图像的位深,即32、24等,计算得到的W是程序中图像每行的字节数。

这里讲述QImage的32、24、8位图。

图像格式:QImage::Format_RGB32 ,QImage::Format_RGB888,QImage::Format_Indexed8。

构造图像:

(1)、QImage myImage1 = QImage(filename); 根据文件名打开图像,如果图像本身是32、24位的,程序中图像是32位的,如果图像本身是8位、1位的,程序中对应为8位、1位。

(2)、QImage myImage2 = QImage(width, height, QImage::Format_…); 根据图像宽高来构造一幅图像,程序会自动根据图像格式对齐图像数据。

操作图像:按照(2)的方式构造图像,在Debug下,如果不给图像myImage2初值,图像不是黑的,但release下,则构造好的图像默认为黑色。

好了,现在我们需要对图像数据操作,32位图像无疑是最简单的,因为它数据是对齐的。用width表示图像宽度,height表示图像高度。首先熟悉几个函数:

a、uchar* bits(); 可以获取图像的首地址

b、int byteCount(); 图像的总字节数

c、int bytesPerLine(); 图像每行字节数

1、QImage::Format_RGB32,存入格式为B,G,R,A 对应 0,1,2,3

QImage::Format_RGB888,存入格式为R, G, B 对应 0,1,2

QImage::Format_Indexed8,需要设定颜色表,QVector

灰度图像颜色表设定:

QVector colorTable;

for(int k=0;k<256;++k)

{

colorTable.push_back( qRgb(k,k,k) );

}

2、QImage image32 = QImage(width, height, QImage::Format_32);

QImage image24 = QImage(width, height, QImage::Format_24);

QImage image8 = QImage(width, height, QImage::Format_8);

image8.setColorTable(colorTable);

3、需要取每个像素处理,采用指针取值,行扫的方式:

int lineNum_32 = 0; //行数

int pixelsub_32 = 0; //像素下标

uchar* imagebits_32 = image32.bits(); //获取图像首地址,32位图

uchar* imagebits24 = image24.bits();

uchar* imagebits8 = image8.bits();

for(int i=0; i

{

//按照通常的理解,我们会如下处理,取每行

lineNum_32 = i * width * 4; //对于任意图像,这句没有问题

// lineNum_24 = i * width * 3; //??当width不是4的整数倍时,这句取不到每行开头 // lineNum_8 = i * width; //??当width不是4的整数倍时,这句取不到每行开头 for(int j=0; j

{

int r_32 = imagebits_32[ lineNum_32 + j * 4 + 2];

int g_32 = imagebits_32[ lineNum_32 + j * 4 + 1];

int b_32 = imagebits_32[ lineNum _32 + j * 4];

// int r_24 = imagebits_24[ lineNum_24 + j * 3]; //注意区别32位的图

// int g_24 = imagebits_24[ lineNum_24 + j *3 + 1];

// int b_24 = imagebits_24[ lineNum_24 + j * 3 + 2];

// int gray_8 = imagebits_8[ lineNum_8 + j];

……

//自己的操作

}

}

//??出问题了,因为实际的图像数据并不是以width为真实宽度的,解决,有两种方法:

第一种方法:自己计算实际的宽度

修改为:

// 获取每行的字节数

int W_32 = ( width * 32 + 31 )/32 * 4; //注意这里没有四舍五入,所以不要随意换算

int W_24 = ( width * 24 + 31 )/32 * 4;

int W_8 = ( width * 8 + 31)/32 * 4;

//也可以使用QT函数来获取,功能和上面一样

{

int W_32 = image32.bytesPerLine();

int W_24 = image24.bytesPerLine();

int W_8 = image8.bytesPerLine();

}

for(int i=0; i

{

//现在可以按照通常的理解,取每行

lineNum_32 = i * W_32; //注意,这里不再需要乘倍数了(4, 3等)

// lineNum_24 = i * W_24;

// lineNum_8 = i * W_8;

for(int j=0; j

{

//这里的操作同上面的一样

}

}

第二种方法:采用scanLine(int)来获取每行的首地址,

for(int i=0; i

{

imagebits_32 = image32.scanLine(i);

imagebits_24 = image24.scanLine(i);

imagebits_8 = image8.scanLine(i);

for(int j=0; j

{

int r_32 = imagebits_32[ j * 4 + 2];

int g_32 = imagebits_32[ j * 4 + 1];

int b_32 = imagebits_32[ j * 4];

// int r_24 = imagebits_24[ j * 3];

// int g_24 = imagebits_24[ j *3 + 1];

// int b_24 = imagebits_24[ j * 3 + 2];

// int gray_8 = imagebits_8[ j ];

……

//自己的操作

}

}

OK,上述两种方法的索引就不会出现图像数据偏移的问题

4、大家注意到QImage的这个构造函数了吧,QImage::QImage ( uchar * data, int width, int height, Format format )

嗯,这个函数就是从uchar* 的数据来构造图像,一般我们都可能先将图像数据存在uchar*中,

uchar* data32 = new uchar[ width * height * 4];

uchar* data24 = new uchar[ width * height * 3];

uchar* data8 = new uchar[ width * height];

从data32构造图像,不会有任何问题,但是当width不是4的整数倍时,你就不可能从data24和data8构造出自己想要的数据,程序会挂掉的,因为这两个数组的数据量根本不够一幅图(还记得数据补齐不)。

解决办法:

你需要首先计算出,你的图像的真实数据量(字节数),可以根据QImage.byteCount()函数来获取图像的字节数,当然,你也可以自己计算,计算公式 byteCount = height * W; 这里的W就是每行的字节数,上面已经讲过了它的计算方法。

然后,你可以由QByteArray来获取转换的指针数据:

如:你的图像数据放在数组 uchar* srcData; 中

QByteArray imageByteArray = QByteArray( (const char*)srcData, byteCount );

uchar* transData = (unsigned char*)imageByteArray.data();

QImage desImage = QImage(transData, width, height, QImage::Format_…);

嗯,经过上述转换后,transData中将是补齐数据的数组,由此构造的图像不会有任何问题。

Qt开发简介

Qt开发简介 诺基亚开发门户网站:https://www.sodocs.net/doc/ff348065.html,/ (资料例程等)Qt开发平台Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所 用功能。Qt是完全面向对象的, 很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的 Linux桌面环境KDE 的基础。基本上,Qt 同X Window 上的Motif,Openwin,GTK 等图形界面库和 Windows 平台上的MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。QT开发环境Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt 框架的开发人员能迅速上手和操作。Qt Creator包含了一套用于创建和测试基于Qt应用程序的高效工具,包括:一个高级的C++代码编辑器上下文感知帮助系统可视化调试器源代码管理项目和构建管理工具QT for

Symbian 开发环境搭建: https://www.sodocs.net/doc/ff348065.html,/Community/Wiki/Qt_Sym bian_开发环境安装Qt优势面向对象Qt 的良好封装机制使得Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt 提供了一种称 为signals/slots 的安全类型来替代callback,这使得各个 元件之间的协同工作变得十分简单。丰富的API Qt包括多达250 个以上的C++ 类,还提供基于模板的collections,serialization,file,I/Odevice,directory management,date/time 类。甚至还包括正则表达式的处理功能。支持2D/3D 图形渲染,支持OpenGL 大量的开发文档XML 支持Webkit 引擎的集成,可以实现本地界面与Web内容的无缝集成但是真正使得Qt 在自由软件界的众多Widgets (如Lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于Qt 的重量级软件KDE 。我的问题:1:如何用Qt 访问https ?Qt 是支持SSL的,但是由于某些法律和政策因素,QT的开发包里并没有集成openSSL。QT采用两种方式调 用openSSL,默认方式是动态加载openSSL的DLL。 在Windows系统上默认没有openSSL,需要自己安装。可以在这里下载源代码,自己编译 https://www.sodocs.net/doc/ff348065.html,/source/

广工计算机网络课设基于UDP的ping.doc

《计算机网络》课程设计 学院 ____计算机学院 _______ 专业 ______软件工程 _______ 年级班别 ______12 级 4 班 _______ 学号91 学生姓名指导教师______ ____ 林炳城 梁路 _ __ ___ ________ 成绩

目录

设计题目 已知技术参数和设计要 求 设计内容与 步骤 设计工作计划与进度安 排 计算机网络课程设计任务书 编程实现基于UDP 的 PING (Java) 1.编程实现 PING 的服务器端和客户端,实现操作系统提供的 ping 命令的类似功能。 2.服务器端PingServer 功能: 可以显示用户通过客户端发送来的消息内容(包含头部和payload); 能够模拟分组的丢失;能够模拟分组传输延迟; 将用户发送来的请求request 在延迟一段随机选择的时间(小于 1s)后返回给客户端,作为收到请求的响应reply; 通过如下命令行启动服务器:java PingServer port 。 port 为 PingServer 的工作端口号 3.客户端 PingClient功能: 启动后发送10 个 request。发送一个request 后,最多等待 1 秒以便接收PingServer 返回的 reply 消息。如果在该时间内没有收到服务器的reply ,则认为该请求或对该请求的 reply 已经丢失;在收到 reply 后立即发送下一 个 request。 请求消息的payload 中至少包含关键字PingUDP 、序号、时间戳等内容。 如: PingUDP SequenceNumber TimeStamp CRLF 其中: CRLF 表示回车换行符(0X0D0A) ; TimeStamp 为发送该消息的机器时间。 为每个请求计算折返时间(RTT) ,统计10 个请求的平均RTT 、最大 /小RTT 。 通过如下命令行启动:java PingClient host port 。 host 为 PingServer 所在的主机地址;port 为 PingServer 的工作端口号 1.学习 ICMP ,了解 ping 命令的工作机理; 2.学习 Java UDP Socket 通信机制; 3.了解 Java 多线程程序设计; 4.服务器 PingServer 程序设计; 5.客户端 PingClient 程序设计。 6.调试与演示 命令工作机制学习 2 小时 UDP Socket 通信机制 2 小时 多线程程序设计 4 小时 程序设计 6 小时 程序设计12 小时 6.调试与演示 4 小时6.课程设计说明书10 小时

基于UDP的文件传输实验报告

实验报告 成 绩 2015年6月 8 日 课程名称 《数据库技术》 学生姓名 *** 学 号 ******** 专业班级 电子信息工程 指导教师

实验名称:基于UDP的文件传输 1.实验目的 (1)熟练掌握Socket编程; (2)分析UDP与TCP的异同。 2.实验设备和条件 硬件环境:PC机 操作系统:Windows 或者Linux 语言环境:Visual C++ ,VS,GCC,Java均可 3.实验要求 参考TCP文件传输demo, 基于UDP实现send.mp3文件的传输,并测试接收到的文件与发送的文件是否一致。 请各位同学于第15周星期三或星期四上课时将纸质版(双面打印)上交! 4.实验内容:测试数据与实验结果(可以抓图粘贴) (1)发送端代码。 #include"stdafx.h" #include #include #define MAX_LENGTH 1024 int_tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); if (WSAStartup(wVersionRequested, &wsaData) != 0)//初始化ws2_32.dll动态库 { printf("WSAStartup() failed!\n");//Winsock初始化错误 exit(-1);

} if (wsaData.wVersion != wVersionRequested) { printf("The version of Winsock is not suited!\n");//Winsock版本不匹配WSACleanup();//结束对ws2_32.dll的调用 exit(-2); } //说明ws2_32.dll正确加载 printf("Load ws2_32.dll successfully!\n"); //创建套接字 SOCKET servsock; printf("Create Socket...\n"); servsock = socket(AF_INET, SOCK_DGRAM, 0);//数据报套接字 int servport = 5555; int iSockErr = 0; //定义服务器地址结构 sockaddr_in udpaddr; int len = sizeof(udpaddr); memset(&udpaddr, 0, sizeof(udpaddr)); udpaddr.sin_family = AF_INET; udpaddr.sin_port = htons(servport); //将一个点分十进制IP地址字符串转换成32位数字表示的IP地址udpaddr.sin_addr.s_addr = inet_addr("172.16.4.94");////INADDR_ANY //读取mp3文件 FILE *fp = NULL; errno_t err; err = fopen_s(&fp, "七里香.mp3", "rb"); if (fp == NULL){ printf("Open File Failed!\n"); getchar(); exit(-5); } char buffer[MAX_LENGTH] = "\0";

基于UDP的文件传输

报告编号:11 综合课程设计报告 基于UDP协议的文件传输系统的设计与实现 学生姓名: 指导教师: 所在系:电子系 所学专业:电子信息工程 年级:08级电子(2)班 2011 年6 月 目录

摘要 (3) 1 实验的相关知识 (4) 1.1通信的模式 (4) 1.2 UDP协议 (4) 1.3 Winsock控件 (4) 1.3.1 Winsock控件重要属性、方法和事件 (5) 1.3.2 Winsock控件通信的工作原理 (7) 2 实验原理 (7) 3 实验步骤 (7) 3.1总体规划 (8) 3.2模块设计 (8) 3.3创建窗体 (8) 3.4程序设计 (10) 3.5系统运行 (11) 4实验结论 (12) 参考文献 (13) 基于UDP的文件传输的系统的设计与实现

摘要 该实验的任务是实现文件的传输,并且是基于UDP协议的。所有文件在该协议下可以实现发送并正确接收。此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。 关键词:UDP协议发送文件接收文件拆包 Winsock控件

1 实验的相关知识 1.1通信的模式 由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。对于C/S的模式,即分为客户端和服务端。服务端用来接收客户端的连接,实现两端之间互相传输文件。采用C/S的模式可以更好的体现程序的功能设计思想,充分调用在LAN中的server和client两方面的处理能力,极大的减少网络上的信息流通量。C/S体系结构有可能提供一种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。 1.2 UDP协议 该实验文件传输是在UDP协议下进行的,UDP提供无连接不可靠的用户数据包传输。其中每一个数据段只有8Byte相对于TCP传输开销较少,且无须对发送速率进行管理。UDP发送数据的速率仅仅受限于程序产生数据的速率,信源主机的性能及internet上可以利用的宽带。并且与TCP不同的是UDP不需要连接,可直接发送,传输数据较快,但同时其稳定性不好,易丢包。 1.3 Winsock控件 Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP 协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量

Qt 编写多窗口程序

编写多窗口程序 导语 程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 在这一篇还会涉及到代码里中文字符串显示的问题。 目录 一、添加主窗口 二、代码中的中文显示 三、添加登录对话框 四、使用自定义的对话框类 正文 一、添加主窗口 1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。 2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。 3.现在运行程序,发现中文可以正常显示。在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。

二、代码中的中文显示 1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。在构造函数MainWindow()中添加代码: MainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”} 这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。 我们使用了QPushButton类的setText()函数来设置按钮的显示文本,现在运行程序,效果如下图所示。 2.我们发现,在代码中来设置按钮的中文文本出现了乱码。这个可以有两种方法来解决,一个就是在编写程序时使用英文,当程序完成后使用Qt语言家来翻译整个软件中的显示字符串;还有一种方法就是在代码中设置字符串编码,然后使用函数对要在界面上显示的中文字符串进行编码转换。因为翻译一个软件很麻烦,对于这些小程序,我们希望中文可以立即显示出来,所以下面来讲解第二种方法。 3.设置字符串编码,可以使用QTextCodec类的setCodecForTr()函数,一般的使用方法就是在要进行编码转换之前调用该函数,下面我们在main.cpp文件中添加代码:

UDP文件传输

1.实验目的 了解udp文件传输过程,掌握传输方法。 2.实验内容 要实现无差错的传输数据,我们可以采用重发请求(ARQ)协议,它又可分为连续ARQ 协议、 选择重发ARQ 协议、滑动窗口协议。本文重点介绍滑动窗口协议,其它的两种有兴趣的可参考相关 的网络通信之类的书。 采用滑动窗口协议,限制已发送出去但未被确认的数据帧的数目。循环重复使用已收到的那些数 据帧的序号。具体实现是在发送端和接收端分别设定发送窗口和接收窗口。 3.实验总结 学会了udp协议传输和代码设计,了解了udp的格式。 发送端的发送线程: int ret; int nPacketCount = 0; DWORD dwRet;

SendBuf sendbuf; DWORD dwRead; DWORD dwReadSize; SendBuf* pushbuf; //计算一共要读的文件次数,若文件已读完,但客户端没有接收完, //则要发送的内容不再从文件里读取,而从m_bufqueue 里提取 nPacketCount = m_dwFileSize / sizeof(sendbuf.buf); //若不能整除,则应加1 if(m_dwFileSize % sizeof(sendbuf.buf) != 0) ++nPacketCount; SetEvent(m_hEvent); CHtime htime; //若已发送大小小于文件大小并且发送窗口前沿等于后沿,则继续发送 //否则退出循环 if(m_dwSend < m_dwFileSize) // 文件没有传输完时才继续传输 { while(1) { dwRet = WaitForSingleObject(m_hEvent, 1000); if(dwRet == WAIT_FAILED) { return false; } else if(dwRet == WAIT_TIMEOUT) { //重发 ::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue 的排斥区 ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf)); ::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区 if(ret == SOCKET_ERROR) { cout << "重发失败,继续重发" << endl; continue; } ResetEvent(m_hEvent); continue; } //若发送窗口大小< 预定大小&& 已读文件次数(nReadIndex) < 需要读文件的次数(nReadCoun t),则继续读取发送 //否则,要发送的内容从m_bufqueue 里提取 if(m_dwSend < m_dwFileSize) { dwReadSize = m_dwFileSize - m_dwSend; dwReadSize = dwReadSize < MAXBUF_SIZE ? dwReadSize : MAXBUF_SIZE;

qt编写的小游戏

自己用qt动手写的小游戏,大家可以参考帮忙改进下,谢谢!! 游戏内容图片下坠,点击即可得分,未点击到则坠落到底则丢失,得分超过20则赢,丢失超过10则输 文件声音和图片为方便均采用绝对路径; 首先需要创建一个ui文件 文件名为hei.ui 里面拉2个label,一个为分数,一个为丢失数,objectname任意取 在拉2个lineedit,对应上面分别取objectivename为pointEdit和missEdit 在拉2个按钮开始游戏和退出游戏objectivename为startGame和quitGame 再依次创建下面文件,并使用下面代码: Hei.pro文件 SOURCES += \ main.cpp \ hei.cpp \ zujian.cpp \ gameArea.cpp FORMS += \ hei.ui HEADERS += \ hei.h \ zujian.h \ gameArea.h RESOURCES += \ image/ico.qrc RC_FILE=image/app.rc //定义运行图标不需要的话可以删掉 main.cpp 运行主文件 #include #include"hei.h" #include int main(int argc,char*argv[]) { QApplication app(argc,argv); QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//使中文有效 heiw w; w.show(); return app.exec(); } gameArea.h 设置游戏区域背景类就是一个400*550的矩形框子,使用painter画笔画的,如果想丰富一点,可将该类换成QLabel继承类,然后贴图作为背景,还可以自动更换图片背景。 #ifndef GAMEAREA_H

基于socket的文件传输软件的设计与实现

哈尔滨工业大学课程结业报告 姓名:学 陈琳 09S003158 计算机科学与技术网络程序设计 2009-12-20

目录 1.基于TCP/IP及UDP的通信传输概述 (2) 2.系统体系结构 (4) 2.1面向TCP连接系统调用过程 (5) 2.2面向UDP连接系统调用过程 (6) 3.系统要求与功能实现 (6) 3.1公共类设计 (6) 3.1.1 IP地址操作类 (6) 3.1.2 DNS相关类 (7) 3.2 TCP文件传输 (8) 3.2.1 服务器端 (8) 3.2.2 客户端 (9) 3.3 UDP文件传输 (10) 3.3.1 服务器端 (11) 3.3.2 客户端 (12) 3.4线程池 (12) 3.5其它 (13) 4.试验结果 (13) 5.思考 (15) 6.结论和收获 (16)

基于socket套接字的文件传输软件的设计与实现1.概述 TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet 最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP 协议和传输层的TCP协议组成的。TCP/IP协议使用范围极广,是目前异种网络通信使用的唯一协议体系,适用于连接多种机型,既可用于局域网,又可用于广域网,许多厂商的计算机操作系统和网络操作系统产品都采用或含有TCP/IP协议。TCP/IP协议已成为目前事实上的国际标准和工业标准。基于TCP/IP协议组的网络模型分为应用层、传输层、网络层、链路层和物理层这样五个层次。TCP/IP 协议组位于应用程序和硬件之间,指挥数据在网络各层中传递。其中传输层的协议包括传输控制协议(TCP)和用户数据报协议(UDP) ,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。TCP协议是面向连接的协议,它提供可靠的字节流服务,在进行数据传输之前必须先建立连接,经三次握手确定后才开始数据传送。UDP进行数据报传输使用的是不可靠、无连接的协议。网络层包括互连网协议 IP,互连网控制报文协议 ICMP和互连网组管理协议IGMP。其中IP协议完成大部分的工作,负责数据传输和路由的选择等。I P报头中的地址和网卡相联系( 具体还涉及地址解析和反向地址解析协议),TCP 、UDP报头中的端口号侧对应着网络主机上不同的程序。TCP/IP体系结构如图一所示:

QT编写一个简单的学生管理系统

嵌入式作业报告 ——学生信息管理系统

学生信息管理系统报告说明书 一.需求分析 利用QT Creator编程环境编写一个简单的学生信息管理系统,与数据库连接,或者直接对.txt文本进行操作,实现对学生信息的增,删,改,查功能。二.总体设计 在窗口刚跳出来时,在左边的QTextEdit对象中显示所有学生的信息,学生的信息被保存在student.txt文件中。右边是几个QPushButton,分别实现增,删,改,查功能。还有一个QLineEdit,用来编辑学生信息。 1.增加学生信息:在行编辑器内输入学生的信息,点击“增加”按钮,该生的信息就会被写入student.txt文件,并且将增加后的所有的学生信息显示在窗口的QTextEdit对象中。 2.删除学生信息:在行编辑器内输入学生的信息,点击“删除”按钮,该生的信息就会从student.txt文件中删除,并且将删除后的所有的学生信息显示在窗口的QTextEdit对象中。 3.修改学生信息:在行编辑器内输入学生的信息,点击“修改”按钮,该生的新的信息就会被写入文件,并且将修改后的所有的学生信息显示在窗口的QTextEdit对象中。 4.查找学生信息:在行编辑器内输入学生的学号,点击“查找”按钮,该生的信息会显示在窗口上。 三.详细设计 若选择直接对文本进行操作,过程比较麻烦。如在进行删除某位学生的信息时,很自然地会想到先找到该生在文件中的位置,再将其后的所有学生信息都向前移动,看起来似乎很简单,但是在文件里进行这些操作时还是要费一些功夫的。经过在网上查资料,得到了一种算法,就是先把文件里的每位学生的信息读出来,放到一个str[]数组中,再通过比较,找到要删除学生所在的数组元素的下标,之后仅仅是对数组内容进行更改,最后再将新的数组元素写入文件中,再通过读文件将信息显示在窗口。下面这段代码是我自己认为在这次作业中取得较

基于UDP的文件传输.

计算机网络综合课程设计报告基于UDP协议的文件传输系统的设计与实现 学生姓名: 指导教师: 所在系:电子信息系 所学专业:电子信息工程 年级: 2013 年6 月

目录 基于UDP的文件传输的系统的设计与实现 (3) 一、实验的相关知识 (3) 1.1通信的模式 (3) 1.2 UDP协议 (4) 1.3 Winsock控件 (4) 1.4 Winsock控件重要属性、方法和事件 (4) 1.6 commomdialog控件 (6) 1.7 timer控件 (7) 三、实验步骤 (7) 3.1总体规划 (7) 3.2模块设计 (8) 3.3创建窗体 (8) 3.4程序设计 (9) 3.5系统运行 (14) 四、实验结论 (15) 五、参考文献 (15)

基于UDP的文件传输的系统的设计与实现 摘要:该实验的任务是实现文件的传输,并且是基于UDP协议的。所有文件在该协议下可以实现发送并正确接收。此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。 关键词:UDP协议;发送文件;接收文件;拆包;Winsock控件 一、实验的相关知识 1.1通信的模式 由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通

QT实现文本编辑器

一用Qt4实现的文本编辑器 1. 新建,打开,保存文件 2.基本的文本编辑功能(复制,粘贴,剪切等) 3.不同风格 4.改变文字的大小,颜色,字体等 界面如下: 二工程文件 1. /* src.pro*/ TEMPLATE = app CONFIG += warn_on \ thread \ qt \ qtestlib TARGET = texteditor DESTDIR = ../bin SOURCES += CMainWindow.cpp \ MainWindow.cpp \ CFindDialog.cpp

HEADERS += CFindDialog.h \ CMainWindow.h \ ui_finddialog.h \ ui_MainWindow.h FORMS += FindDialog.ui \ MainWindow.ui RESOURCES += MainWindow.qrc QT += qt3support 2. /*CMainWindow.cpp*/ #include "CMainWindow.h" #include "CFindDialog.h" #include #include CMainWindow::CMainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(this); iniStatusBar(); iniConnect(); fontColorAct = new QAction(QPixmap(32, 32), tr("改变字体颜色"), this); styleToolBar = new QToolBar(this); styleToolBar->setObjectName(QString::fromUtf8("styleToolBar")); styleToolBar->setOrientation(Qt::Horizontal); this->addToolBar(Qt::TopToolBarArea, styleToolBar); menu_2->addAction(fontColorAct); styleToolBar->addAction(fontColorAct); show(); connect(fontColorAct, SIGNAL(triggered()), this, SLOT(changeColor())); } void CMainWindow::iniConnect() { connect(textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(doCursorChanged())); connect(textEdit->document(), SIGNAL(contentsChanged()),

基于udp的文件传输实验报告

一实验目的 1了解udp文件传输的具体内容 2明白发送窗口,接收窗口的定义 3理解发送端的发送线程,以及发送端的接收线程 4掌握接收端的接收线程 二实验内容 基于udp协议的文件传输,以及相关代码 三实验步骤 1发送窗口 发送窗口用来对发送端进行流量控制。发送窗口的大小Wt 代表在还没有收到对方确认的条件下,发送端最多可以发送的数据帧的个数。 2接收窗口 接收窗口用来控制接收数据帧。只有当接收到的数据帧的发送序号落在接收窗口内,才允许将该数据帧收下,否则一律丢弃。接收窗口的大小用Wr 来表示,在连续ARQ 协议中,Wr = 1。 在接收窗口和发送窗口间存在着这样的关系:接收窗口发生旋转后,发送窗口才可能向前旋转,接收窗口保持不动时,发送窗口是不会旋转的。这种收发窗口按如此规律顺时钟方向不断旋转的协议就犯法为滑动窗口协议。 发送端的发送线程: int ret; int nPacketCount = 0; DWORD dwRet; SendBuf sendbuf; DWORD dwRead; DWORD dwReadSize; SendBuf* pushbuf; //计算一共要读的文件次数,若文件已读完,但客户端没有接收完, //则要发送的内容不再从文件里读取,而从m_bufqueue 里提取 nPacketCount = m_dwFileSize / sizeof(sendbuf.buf); //若不能整除,则应加1 if(m_dwFileSize % sizeof(sendbuf.buf) != 0) ++nPacketCount; SetEvent(m_hEvent); CHtime htime; //若已发送大小小于文件大小并且发送窗口前沿等于后沿,则继续发送 //否则退出循环 if(m_dwSend < m_dwFileSize) // 文件没有传输完时才继续传输 { while(1) { dwRet = WaitForSingleObject(m_hEvent, 1000);

QT界面开发

1Qt4界面开发 1.1Q t历史 Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的API 和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它支持Java?和C++开发。Qt让企业无须重新编写源代码,便可以构建运行在不同桌面操作系统和嵌入式设备上的软件应用程序。 Qt框架最早可公开获取是在1995年5月。最初是由Haavard Nord(TrollTech公司的首席执行官)和Eirik Chambe-Eng(TrollTech公司的董事会主席)。Haavard和Eirik 最早在特隆赫姆的挪威技术学院相遇,在那里他们双双获得了计算机科学硕士学位。 早在1991年,Haavard 就开始写一些最终成为Qt的类,并和 Eirik合力设计。在接下来的一年,Eirik提出了“信号和槽”的思想,一个现在已经被一些其他套装工具包含简单但功能强大的GUI编程范式。Haavard 接受了这一思想并手工生成了这一思想的代码实现。到1993年,Haavard和Eirik已经完成了Qt的第一个图形内核的开发并能用它来实现一些他们所需的物件。在这一年的年末,Haavard建议他们一起去经商,创建一个“世上最好的C++ GUI框架”。 字母“Q”被选为类的前缀是因为这个字母在Haavard的Emacs字体中看起来很漂亮。受到Xt(the X toolkit)的启发,字母“t”被追加来表示“toolkit”。公司在1994年5月4日成立,起初被命名为“Quasar Technologies”,之后被改名为“Troll Tech”,今天则被称为奇趣科技(Trolltech)。 1995年5月20日,Qt 0.90被上传到https://www.sodocs.net/doc/ff348065.html,。六天后,这一发布在comp.os.linux.announce被宣布。这是Qt的第一个公共发行版。Qt可以被用在Windows 和Unix开发中,在两个系统中提供相同的API。Qt从一开始就可以在两种许可协议下获取:一个是商业开发中需要的商业许可协议,一个用于开源开发的自由软件版。 1996年3月,欧洲航天局成为Qt的第一个客户,一下买了十个Qt商业许可。Qt 0.97在同年的5月底发布,1996年9月24日,Qt 1.0发布。到了同年年底,Qt到达了版本1.1;拥有8个客户,每一个都在不同的国家,他们购买了18个商业许可。 Qt 1.2 在1997年4月发布。Matthias Ettrich利用Qt构建KDE的决定帮助Qt成为Linux C++ GUI 开发的实际标准,1997年9月Qt 1.3发布。 1998年9月,Qt 1的最后一个主要发行版1.40发布。Qt 2.0于1999年7月发布。Qt 2有了一个新的开源许可协议,发布许可协议(QPL),遵守开源的定义。1999年8月,Qt赢得了LinuxWorld的“最佳开发库/工具”大奖。 2000年奇趣科技发布了Qtopia核心(后来成为Qt/Embedded)。它被设计用来运行在嵌入式Linux设备上并提供了自己的窗口系统作为X11的一个轻量级代替。现在Qt/X11和Qtopia核心都可以通过GNU通用许可(GPL)获取。到2000年年底,奇趣科技成立了Trolltech Inc.(USA)并且发布了Qtopia的第一个版本,一个移动电话和PDAs应用程序平台。Qtopia赢得了2001和2002年LinuxWorld的“最佳嵌入式 Linux 解决方案”大奖,

基于UDP的文件传输

报告编号:11 综合课程设计报告 基于UDP协议的文件传输系统的设计与实现 学生姓名: 指导教师: 所在系:电子系 所学专业: 年级:08级电子(2)班 2011 年6 月 目录 摘要 (3) 1 实验的相关知识 (4) 1.1通信的模式 (4)

1.2 UDP协议 (4) 1.3 Winsock控件 (4) 1.3.1 Winsock控件重要属性、方法和事件 (5) 1.3.2 Winsock控件通信的工作原理 (7) 2 实验原理 (7) 3 实验步骤 (7) 3.1总体规划 (8) 3.2模块设计 (8) 3.3创建窗体 (8) 3.4程序设计 (10) 3.5系统运行 (11) 4实验结论 (12) 参考文献 (13) 基于UDP的文件传输的系统的设计与实现

摘要 该实验的任务是实现文件的传输,并且是基于UDP协议的。所有文件在该协议下可以实现发送并正确接收。此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。 关键词:UDP协议发送文件接收文件拆包 Winsock控件

1 实验的相关知识 1.1通信的模式 由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。对于C/S的模式,即分为客户端和服务端。服务端用来接收客户端的连接,实现两端之间互相传输文件。采用C/S的模式可以更好的体现程序的功能设计思想,充分调用在LAN中的server和client两方面的处理能力,极大的减少网络上的信息流通量。C/S体系结构有可能提供一种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。 1.2 UDP协议 该实验文件传输是在UDP协议下进行的,UDP提供无连接不可靠的用户数据包传输。其中每一个数据段只有8Byte相对于TCP传输开销较少,且无须对发送速率进行管理。UDP发送数据的速率仅仅受限于程序产生数据的速率,信源主机的性能及internet上可以利用的宽带。并且与TCP不同的是UDP不需要连接,可直接发送,传输数据较快,但同时其稳定性不好,易丢包。 1.3 Winsock控件 Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP 协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量

基于Qt5的闹钟实现代码

本程序基于QWidget实现,可以动态显示钟表,并且可以添加铃声 头文件widget.h代码如下: #ifndef WIDGET_H #define WIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); signals: void isCurrentTime(); private: Ui::Widget *ui; void init(); void layout(); void con();

QLCDNumber *lcdNumber; QLabel *label; QTimeEdit *timeEdit; QPushButton *button; QTimer *timer; QTimer *uptimer; QTimer *dtimer; QTimer *itimer; QRect rect; int x; int y; double du; QSystemTrayIcon *trayIcon; QAction *restoreAct; QAction *quitAct; QMenu *trayIconMenu; private slots: void clockChange(); void dialogUp(); void mini(); void down(); void comToCur(); protected: void closeEvent(QCloseEvent *e); }; #endif // WIDGET_H 源文件widget.cpp代码如下: #include "widget.h" #include "ui_widget.h" #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); init(); layout(); con();

简单UDP传输代码

//UDPcilentCEHO 文件传输客户端 #pragma comment(lib,"ws2_32.lib") #include #include #include #define MAX_BUF 65536 #define K_BUF 256 int main() { //初始化 WSAData wsaData; int err=WSAStartup(WINSOCK_VERSION,&wsaData); if(0!=err) { return -1; } SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); if(sock == INV ALID_SOCKET) { printf("socket() Failed: %d\n", WSAGetLastError()); WSACleanup(); return -1; } //char destIP[] = "10.3.120.137"; char destIP[] = "172.17.195.174"; unsigned short destPort = 20000; sockaddr_in destAddr; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(destPort); destAddr.sin_addr.s_addr = inet_addr(destIP); printf("UDPclientCEHO had startup ! \n"); char data[]="Hello world ! "; int sByte; sByte = sendto(sock,data, strlen(data), 0, (sockaddr *)&destAddr, sizeof(destAddr)); if(sByte == SOCKET_ERROR) { printf("sendto() Failed: %d\n", WSAGetLastError()); closesocket(sock); WSACleanup(); getchar();

相关主题