سوکت پروگرمینگ در کیوت

 

سوکت پروگرمینگ یک بحث جذاب داخل شبکه است، در اینجا به بحث سوکت می پردازم،مثال های را ارایه می کنم. ترجمه سوکت به معنای حفره یا پریز هم می باشد، و در بحث های سخت افزاری هم با این واژه به کار می بریم. در بحث سوکت نویسی بهتره بری درک بهتر دوره های از شبکه گذرانده باشیم. هر سوکت در برنامه نویسی آبجکت گرا یک آبجکت است، که این آبجکت داری دو پروپرتی خیلی مهم است، یک آدرس آی پی که  شناسه و آدرس سوکت ما می باشد. در سوکت پروگرمرینگ ما دو سمت داریم، یکی سمت کلاینت، سمت سرور، که قاعدتا کلاینت یک سرویس می گیرد،سرور هم که مشخص است سرویسی را به کلاینت ها ارایه می کند.

هرآدرس ای پی ممکن است، سرویس های مختلفی بخواهد کند، علاوه بر آدرس ای پی، ما پروپرتری دیگری به نام پورت داریم، که تعدادپورت ها ۶۵۵۳۵ می باشد، که هر سرویس برروی یک پورت خاص اجرا می شود.مثلا پروتکل ایمیلش شماره اش ۲۵ و برای پروتکل اچ تی پی یا به عبارتی صفحات وب معمولا پورت ۸۰ می باشد.

کدهای سوکت را در این جا اشتراک می گذارم.

زبان برنامه نویسی پایتون:

سورس زیر با تعریف ابجکت سوکت، ومشخص کردن پروپرتی های آن مانند آدرس ای پی، شماره پورت، طول بافر فایل را به آدرس ای پی مشخص شده می فرستد،فقط نکته ای که بیان کنم، اگر حجم فایل از طول بافر بیشتر باشد، فایل را طی چند مرحله خواهد فرستاد.(لازم به ذکر است، تمامی سوکت های این پست همگی UDP می باشد، تفاوتی که UDP و TCP با هم دارند، UDP برعکس TCP کانکشن لس می باشد، که معولا از این پروتکل ها برای استریم ها استفاده می شود.)

  1. # ----- sender.py ------
  2.  
  3. #!/usr/bin/env python
  4.  
  5. from socket import *
  6. import sys
  7.  
  8. s = socket(AF_INET,SOCK_DGRAM)
  9. host =sys.argv[1]
  10. port = 9999
  11. buf =54625
  12. addr = (host,port)
  13.  
  14. file_name=sys.argv[2]
  15.  
  16. s.sendto(file_name,addr)
  17.  
  18. f=open(file_name,"rb")
  19. data = f.read(buf)
  20. while (data):
  21. if(s.sendto(data,addr)):
  22. print "sending ..."
  23. data = f.read(buf)
  24. s.close()
  25. f.close()

 

برای سمت سوکتی که پیام رسیده را پرینت می کند، در نهایت پیام را داخل یک فایل تکست ذخیره خواهد کرد. آدرس ای پی، شماره پورت و بافر هم که قابل تنظیم است.

  1. # ----- receiver.py -----
  2.  
  3. #!/usr/bin/env python
  4.  
  5. from socket import *
  6. import sys
  7. import select
  8.  
  9. host="127.0.1.1"
  10.  
  11. port = 1234
  12. s = socket(AF_INET,SOCK_DGRAM)
  13. s.bind((host,port))
  14.  
  15. addr = (host,port)
  16. buf=12024
  17.  
  18. data,addr = s.recvfrom(buf)
  19. print "Received File:",data.strip()
  20. f = open(data.strip(),'wb')
  21.  
  22. data,addr = s.recvfrom(buf)
  23. try:
  24. while(data):
  25. f.write(data)
  26. s.settimeout(2)
  27. data,addr = s.recvfrom(buf)
  28. except timeout:
  29. f.close()
  30. s.close()
  31. print "File Downloaded"

 

کیوت:

کیوت یک فریم ورک برای سی پلاس پلاس می باشد، (هرچند برای پایتون هم آمده و البته جاوا) برای برنامه نویسی سوکت سی پلاس پلاس یا پایتون اصول همه آنها یکی است، فقط سینتکس زبان فرق می کند:)

خوب ابتدا یک پروژه کنسول در کیوت که ساختیم، باید در فایل .pro اعلام کنیم که می   خواهیم از کلاس های شبکه استفاده کنیم، پس در فایل این دیکلریشن را اضافه می کنم

QT       += network

بعد کلاس را تحت عنوان MyUDP خواهم ساخت(از طریقا اضافه کردن کلاس جدید در کیوت،کلیک راست، اد نیو کلاس )
هرکلاس که در کیوت ساخته می شود، دو فایل دارد، فایل سورس و فایل هدر فایل:
در زیر هدرفایل کلاس یو دی پی را مشاهده می کنید.

  1. // myudp.h
  2.  
  3. #ifndef MYUDP_H
  4. #define MYUDP_H
  5.  
  6. #include
  7. #include
  8.  
  9. class MyUDP : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MyUDP(QObject *parent = 0);
  14. void HelloUDP();
  15. signals:
  16.  
  17. public slots:
  18. void readyRead();
  19.  
  20. private:
  21. QUdpSocket *socket;
  22.  
  23. };
  24.  
  25. #endif // MYUDP_H

در زیر سورس کلاس یو دی پی را مشاهده می کنید.

  1. // myudp.cpp
  2.  
  3. #include “myudp.h”
  4.  
  5. MyUDP::MyUDP(QObject *parent) :
  6. QObject(parent)
  7. {
  8. // create a QUDP socket
  9. socket = new QUdpSocket(this);
  10.  
  11. // The most common way to use QUdpSocket class is
  12. // to bind to an address and port using bind()
  13. // bool QAbstractSocket::bind(const QHostAddress & address,
  14. // quint16 port = 0, BindMode mode = DefaultForPlatform)
  15. socket->bind(QHostAddress::LocalHost, 1234);
  16.  
  17. connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
  18. }
  19.  
  20. void MyUDP::HelloUDP()
  21. {
  22. QByteArray Data;
  23. Data.append(“Hello from UDP”);
  24.  
  25. // Sends the datagram datagram
  26. // to the host address and at port.
  27. // qint64 QUdpSocket::writeDatagram(const QByteArray & datagram,
  28. // const QHostAddress & host, quint16 port)
  29. socket->writeDatagram(Data, QHostAddress::LocalHost, 1234);
  30. }
  31.  
  32. void MyUDP::readyRead()
  33. {
  34. // when data comes in
  35. QByteArray buffer;
  36. buffer.resize(socket->pendingDatagramSize());
  37.  
  38. QHostAddress sender;
  39. quint16 senderPort;
  40.  
  41. // qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize,
  42. // QHostAddress * address = 0, quint16 * port = 0)
  43. // Receives a datagram no larger than maxSize bytes and stores it in data.
  44. // The sender’s host address and port is stored in *address and *port
  45. // (unless the pointers are 0).
  46.  
  47. socket->readDatagram(buffer.data(), buffer.size(),
  48. &sender;, &senderPort;);
  49.  
  50. qDebug() << “Message from:<< sender.toString();
  51. qDebug() << “Message port:<< senderPort;
  52. qDebug() << “Message:<< buffer;
  53. }

 

Sharing is caring!

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *