资源描述:
《基于socket发送图片总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、基于socket的图片传输系统设计一.设计思路。本设计利用了socket通信的原理,通过socket建立一个服务端和客户端相互通信并发送图片最后在QT上显示。设计用到知识有:socket编程、多进程的编程、多路I/O复用、QT的编程。二.部分知识解析。①socket通信实质以及过程介绍。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。为了建立Socket,程序可以调用So
2、cket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:intsocket(intdomain,inttype,intprotocol);domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值"0"。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。So
3、cket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind
4、函数来配置本地信息。Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind函数原型为:intbind(intsockfd,structsockaddr*my_addr,intaddrlen);面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用sock
5、et时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。 Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。Send()和recv()这两个函数用于面向连接的socket上进行数据传输。Send()函数原型为:intsend(intsockfd,constvoid*msg,intlen,intflags);Sockfd是你想用来传输数据的socke
6、t描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。②发送图片模块介绍。其实发送图片和一般的发送数据完全一样,在这里在/home下有一张图片“1.jpg”,那么建立socket连接后,就要调用fopen函数打开这个图片,注意是以二进制流的方式打开,这
7、样打开之后就可以读取到其中的数据。原型为:fP=fopen("/home/1.jpg","ab"),这样打开之后图片就可以读取出来,然后读取到一个数组里。函数原型为:fd=fread(buffer,1,sizeof(fp),fp)这样就可以把buffer里的数据发送到soxket套接字中。③图片接收端介绍图片接收端主要是利用QT写的一个服务器的程序。程序如下:QLabel*label=newQLabel("",0);//初始化qlabelQPixmappm("/yanjl/qt/qt_jpg/han.jpg");//设定要显示
8、的图片ui->label->setPixmap(pm);//将图片加载到label上ui->label->setGeometry(0,0,240,320);//屏幕大小,初始位置QTcpSocket、QtcpServer是在socket的基础上封装各种类,原理都一样,大差不差