리눅스 학습 노트 (V) : 네트워크 프로그래밍, QT 신호와 슬롯 메커니즘

질병의 발병하지만 우리의 연구의 속도를 멈출 수는 현재 유행 나은, 집에 자신의 캔 중 거의 한 달에 마지막으로 마스크를 쓰고 나가! ! !
그림 삽입 설명 여기

연결
리눅스 학습 노트 (a)는
리눅스 연구 노트 (b)는
리눅스 학습 노트 (C) : 기능, 파일 IO 및 스레드
리눅스 학습 노트 (D) : 정보의 양, 동기화, 상호 배제 및 네트워크 프로그래밍

리뷰

P V 운전 조작

다음은 서버와 클라이언트 검토 설명에 주로 다음과 같은 :

1, 서버 : 서버

//建立连接1socket( );//创建套接字
	声明:int socket(int domain, int type,int protocol)
	int sock = socket(PF_INET,SOCK_STREAM,0;2bind( );//绑定自己的IP
	声明:int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
	bind(sock,(struct sockaddr*)(&myaddr),sizeof(myaddr));
		sockfd:是由socket调用返回的文件描述符.
		addrlen:是sockaddr结构的长度.
		my_addr:是一个指向sockaddr的指针. 在中有 sockaddr的定义
(3listen( );//监听是否有客户端向服务器发起连接
	声明:int listen(int sockfd,int backlog)
		sockfd:是bind后的文件描述符.
		backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度. 函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.4accept( );//接受客户端的请求
	声明:int accept(int sockfd, struct sockaddr *addr,int *addrlen)
		sockfd:是listen后的文件描述符.
		addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可了. bind,listen和accept是服务器端用的函数, accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符, 这个时候服务器端可以向该描述符写信息了. 失败时返回-1//接收数据5write( );//send( );6read( );//recv( );
//关闭7close( );

2, 클라이언트 : 클라이언트

//建立连接1socket( );2connect( );//主动发起与服务器的连接
	声明:int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
		sockfd:socket返回的文件描述符.
		serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址
		addrlen:serv_addr的长度
		connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1.
//接收数据3read( );//recv();4write( );//send();
//关闭 5close( );

(1) 네트워크 프로그래밍 :

그것을 프로그래밍 네트워크는 무엇입니까? ? ? ? ?
즉,이 개 과정은 컴퓨터를 통해, 그들은 네트워크를 통해, 필요 엉덩이를 전달해야합니다. 이 소켓의 역할이다. 유추, 두 대의 컴퓨터에 두 개의 프로세스, 당신은 서버라고하는 수동적 인 측면을 할 수있는 과정이 필요합니다. 또 다른 이니셔티브는 클라이언트라는 파티를 수행합니다. 그들은 컴퓨터에있는 호스트 호스트라고, 네트워크에 자신의 IP 주소를 가지고있다. 이 서버와 같은 컴퓨터에서 여러 프로세스,하지만 그래서 다른 포트 번호로 시스템 당 하나의 IP를 구별 할 수 있습니다. 따라서 서버 프로그램은 컴퓨터의 포트 번호에 바인드 할 필요가있다. 클라이언트는 자신의 연결을 해결 포트 선언 할 필요가있다. 두 프로세스는 네트워크를 통해 통신 채널을 설정 한 다음 보내고 RECV 보내기, 완전한 의사 소통의 전화 번호를 통해 정보를받을 수 있습니다. 소켓 그래서이 통신의 베어러 대신 시스템 자원의 식별을 의미합니다.

일반 단어에서 전송 : HTTPS : //www.zhihu.com/question/29637351/answer/110219546

클라이언트 / 서버 모드 TCP / IP를 네트워크 응용 프로그램은, 두 프로세스 사이의 통신은 상호 작용의 기본 모드입니다클라이언트 / 서버 (클라이언트 / 서버, C / S) 모드즉, 서버에 서비스 요청을 발행하는 클라이언트, 서버가 해당 서비스를 제공하는 요청을 수신한다.
빌드 클라이언트 / 서버 모델다음 두 가지 사항을 바탕으로 :
(1) 먼저, 하드웨어 및 소프트웨어 자원, 불평등 한 컴퓨팅 파워 및 정보 네트워크 공유에 대한 필요성, 따라서 호스트를 만드는 네트워크의 원인을 수립하는 서비스를 제공하기 위해 많은 자원, 적은 자원을 가지고 서비스 클라이언트 요청이 비 피어 역할.
(2) 둘째로, 네트워크 간 통신의 방법은 프로세스 간 통신을 희망하는 메커니즘에 대한 필요성이 접촉을 수립하도록 서로 공유하지 메모리 버퍼와 통신 프로세스 간의 어느 부모 - 자식 관계가 모두 위해서,가 완전히 비동기 클라이언트 / 서버 TCP / IP를 기반으로 동기식 데이터 교환을 제공합니다.
그림 삽입 설명 여기
서버 측다음 과정은 먼저 제 서버 측을 시작하고, 요청에 따라 서비스를 제공한다 :
(1) 주소 기꺼이 특히, 통신 채널을 열고 로컬 호스트 통지 포트를 인식 (FTP 포트 (21)가있을 수 등) 클라이언트 요청을 수신하는 단계와
, (2)가 클라이언트 요청을 기다리는 포트에 도착
, 클라이언트로부터 서비스 요청을 수신하는 단계 (3)는 요청을 처리하고, 응답 신호를 송신한다. (예 : 포크를 사용하여 UNIX 시스템, 임원 등) 고객의 요청을 처리하기 위해 새로운 프로세스를 활성화하는 동시 서비스 요청을 받았습니다. 핸들 고객의 요청이 새로운 프로세스는 다른 요청에 응답 할 필요가 없습니다. 서비스가 완료되면, 새로운 프로세스와 고객의 통신 링크 및 종료를 닫습니다.
(4) 창 (2) 단계, 다른 제 요청 클라이언트 기다린다.
서버의 전원 (5)

Server:
      int sock = socket(PF_INET,SOCK_STREAM,0);
      bind(sock,(struct sockaddr*)(&myaddr),sizeof(myaddr));
      struct sockaddr_in myaddr;
      myaddr.sin_family = PF_INET;
      myaddr.sin_port = htons(8888);
      myaddr.sin_addr.s_addr = inet_addr("192.168.13.119");
      listen(sock,7);
      int connfd = accept(sock,NULL,NULL);

클라이언트:
(1) 통신 채널을 열고, 호스트 서버에 접속되어 특정 포트이며,
서버 (2) 요청 패킷 서비스 대기를 전송하고 응답을 수신하고 상기 요청을 계속해서
요구하고 종료하기 (3)의 종료 후, 근접 통신 채널 .

client:
      connect(sock,(struct sockaddr*)(&seraddr),sizeof(seraddr));
      send(sock,”hello”,10,0);
      recv(sock,buf,sizeof(buf),0);
      close(sock);

(1) 서버 서버 수신하고 데이터 송신

创建套接字:Int sock = socket(PF_INET,SOCK_STREAM,0);
绑定自己的IP:bind(sock,(struct sockaddr*)(&myaddr),sizeof(myaddr));
主动发起与服务器的连接:struct sockaddr_in myaddr;
                      myaddr.sin_family = PF_INET;
                      myaddr.sin_port = htons(8888);
                      myaddr.sin_addr.s_addr = inet_addr("192.168.13.119");
监听:listen(sock,7);
接受请求:int connfd = accept(sock,NULL,NULL);
发送数据:send(sock,”hello”,10,0);
接收数据:recv(sock,buf,sizeof(buf),0);

도 2에서, 클라이언트와 클라이언트가 전송 된 데이터를 수신하여

发送数据:send(sock,”hello”,10,0);
接收数据:recv(sock,buf,sizeof(buf),0);

(2) QT 연구 프로그램

1, 어떻게 프로젝트를 만들려면

특별한주의가 추가 될 리눅스 QT 환경 구성을 설치하는 것입니다
다음 [터미널]에서 명령을 실행 한 sudo gedit /etc/profile
2 다음을 추가

32 비트 시스템 구성 :

export QTDIR=/wyj/Qt5.4.1/5.4
export PATH=$QTDIR/gcc/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/gcc/lib:$LD_LIBRARY_PATH

64 비트 시스템 구성 :

export QTDIR=/opt/Qt5.4.1/5.4
export PATH=$QTDIR/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/gcc_64/lib:$LD_LIBRARY_PATH

; 응용 프로그램 -> Qt는 위젯 Appliccation : (1) 열기 Qt는 창조주, 생성, 새 프로젝트 새 프로젝트를 클릭
자신 만의 설정을 만들 프로젝트 이름과 경로를 (2),
(3) 키트 선택 선택의 gcc 크로스 컴파일러,
(4) 시스템의 경우 OpenGL을 라이브러리가 소유하지 않는 경우, 불평 3D 효과와 인터페이스를 수행 수동으로 OpenGL을 설치합니다. 첫째, 시스템 설정 및 소프트웨어 업데이트를 수정 ---- ---- ---- 중국의 서버에서 다운로드.

2 QT 콘택트 홈을 운반하는 키를 생성하는 기능을 사용하는 방법, 텍스트 표시

신호 슬롯기구 콜백 함수에 상당한다. 이 메커니즘에서, 프로그래머는 두 개의 이벤트를 처리 할 수있는 기회를 갖게 :

  1. 전처리 전에 발사 신호 캡쳐 이벤트 (기대에 부응하지 않는 이벤트가 신호를 송신 할 수 없습니다)
  2. 주 처리는 슬롯 기능 수행
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QMovie>
#include <QLineEdit>
#include "JasonQt/JasonQt_Vop.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
	// 连接完成函数
    void connectDone();

    void recvdo();
	// 按钮的槽函数
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_4_pressed();

    void on_pushButton_4_released();

private:
	// tcp连接函数
    void tcpConnect();
    bool Data_parsing(QByteArray);
private:
    Ui::Widget *ui;
    QTcpSocket tcpSocket,pic_socket;
    QMovie *movie;
    QLineEdit *line;
    JasonQt_Vop::BaiduVop m_baiduVop;
    unsigned int piclen;
    char picbuf[1024 * 1024 - 4];
};

#endif // WIDGET_H

2, UI 자동 수동을 사용하는 방법을 버튼과 텍스트를 만들

다음과 같이 mainwindow.ui 인터페이스에서, 푸시 버튼 버튼을 추가
그림 삽입 설명 여기
새 인터페이스를 선택할 수있는 파일의 내용을 표시하는 데 사용되는 텍스트 편집기 컨트롤을 추가 한 후, 당신은 레이아웃 선택 후 레이아웃을 선택할 수 있습니다 (윈도우의 빈 부분을 클릭 한 다음 화면의 레이아웃 상단을 선택).

(3) 사례 연구

네트워크 프로그래밍 : 클라이언트와 서버 사이의 통신

우분투는 현재 네트워크의 IP 주소를 볼은 ifconfig를 사용에서.
열기 개의 터미널, 실행중인 각 서버와 클라이언트 코드 :

서버 :

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include<unistd.h>

int main(){
    /*1.创建套i接字*/
   int sock = socket(PF_INET,SOCK_STREAM,0);
    if(sock < 0){
        printf("socket error\n");
        return -1;
    }
    printf("socket success\n");
    /*2.绑定本地IP*/
    struct sockaddr_in myaddr;
    myaddr.sin_family = PF_INET;
    myaddr.sin_port = htons(8888);// 设置端口号,我这里设置的是8888
    myaddr.sin_addr.s_addr = inet_addr("xxx.xxx.xx.xxx");// 设置自己当前网端下的IP地址

    if(0 > bind(sock,(struct sockaddr*)(&myaddr),sizeof(myaddr))){
        printf("bind error\n");
        return -1;
    }
    printf("bind success\n");
    /*3.监听*/
    if(0 > listen(sock,10)){
        printf("listen error\n");
        return -1;
    }
    printf("listen success\n");
    /*4.接受链接请求*/
    int connfd = accept(sock,NULL,NULL);
    if(connfd < 0){
        printf("accept error\n");
        return -1;
    }
    printf("accept success\n");
    /*5.数据收发*/
    //send()/recv();
    char buf[20];
    gets(buf);
    int ret = send(connfd,buf,sizeof(buf),0);
    if(ret < 0){
        printf("send error\n");
        return -1;
    }
    printf("send success\n");
    /*6.关闭套接字*/
    close(connfd);
    close(sock);
return 0;
}

클라이언트 :

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include<unistd.h>

int main(){
    /*1.创建套接字*/
   int sock = socket(PF_INET,SOCK_STREAM,0);
   if(sock < 0){
        printf("sock error\n");
        return -1;
    }
    printf("sock success\n");
    /*2.主动发起与服务器的连接*/
    struct sockaddr_in seraddr;
    seraddr.sin_family = PF_INET;
    seraddr.sin_port = htons(8888);
    seraddr.sin_addr.s_addr = inet_addr("xxx.xxx.xx.xxx");// 一定与服务器的IP地址一样
    if(0 > connect(sock,(struct sockaddr*)(&seraddr),sizeof(seraddr))){
        printf("connect errorr\n");
        return -1;
    }
    printf("connect success\n");

    /*3.数据收发*/
    char buf[20];
   int ret = recv(sock,buf,sizeof(buf),0);
    if(ret < 0){
        printf("recv error\n");
        return -1;
    }
    printf("recv:%s\n",buf);
    /*4.关闭套接字*/
    close(sock);
    return 0;
}

결과 :

그림 삽입 설명 여기
서버와 클라이언트 사이의 가시 통신이 돈을 지불하고있다! ! ! ! ! !
그림 삽입 설명 여기

모든 사람의 trifecta에 나에게 가장 큰 긍정이다! ! ! 그것은 당신의 마우스 나 손가락을 의미하지 않는다. . . . . .

에 계속. . . . . .

게시 11 개 원래 기사 · 원의 찬양 (11) · 전망 (515)

추천

출처blog.csdn.net/ywsydwsbn/article/details/105007111