qt 下 原生socket tcp 基本用法

qt中使用socket,
首先要包含windows.h头文件
还要在pro文件中,增加:LIBS += -lpthread libwsock32 libws2_32 引入相关函数的库

TCP 稳定传输
服务器端:
0、在使用socket的之前,要调用WSAStartup函数,不然会导致后面的连接失败;
1、首先需要socket的创建 使用socket函数初始化;
2、创建SOCKADDR_IN服务器端结构体,初始化;
3、绑定服务器地址,使用bind函数;
4、设置服务器监听,使用listen函数;
5、创建SOCKADDR_IN客户端结构体,并使用accept函数和服务器相关联;
6、accept接收成功信号后,使用send、recv函数编写收发逻辑;
7、退出时调用closesocket函数,销毁socket;
示例代码:

#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
    cout << "Hello World!" << endl;
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
    {
        cout<<"failed to load winsock"<<endl;
    }


    SOCKET socketSer;
    socketSer = socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(8000);//自定义端口
    addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//此demo使用本机做测试

    bind(socketSer,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));

    listen(socketSer,5);


    SOCKADDR_IN addrClic;
    SOCKET sockAccept;

    int len = sizeof(SOCKADDR);
    sockAccept = accept(socketSer,(SOCKADDR*)&addrClic,&len);
    if(sockAccept == INVALID_SOCKET)
    {
        cout<<"accept client fail"<<endl;
        return 0 ;
    }
    else
    {
        cout<<"accept client success!"<<endl;
    }

    char sendbuff[1024];
    char recvbuff[1024];
    while(true)
    {
        cout<<"ser:";
        cin>>sendbuff;
        if(strcmp(sendbuff,"q") == 0)
        {
            break;
        }
        send(sockAccept,sendbuff,strlen(sendbuff) + 1,0);

        recv(sockAccept,recvbuff,1024,0);
        cout<<recvbuff<<endl;
    }
    closesocket(socketSer);

    return 0;
}

客户端:
0、同样需要调用WSAStartup函数;
1、创建客户端socket,并初始化;
2、创建SOCKADDR_IN服务器端结构体,初始化;
3、将客户端socket与服务器端相连接,使用connect函数;
4、接收connect成功的返回值后,利用send、recv函数编写收发逻辑;
5、退出时调用closesocket函数。

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
    {
        cout<<"failed to load winsock"<<endl;
    }

    SOCKET socketClient;
    socketClient = socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(8000);
    addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    int ret = connect(socketClient,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));
    if(ret != 0)
    {
        cout<<"connect server fail"<<endl;
        return 0;
    }
    else
    {
        cout<<"connect server success"<<endl;
    }
    char sendBuff[1024];
    char recvBuff[1024];
    while(true)
    {
        recv(socketClient,recvBuff,1024,0);
        cout<<"ser:"<<recvBuff<<endl;

        cout<<"cli:";
        cin>>sendBuff;

        if(strcmp(sendBuff,"q") == 0)
        {
            break;
        }
        send(socketClient,sendBuff,strlen(sendBuff) + 1,0);
    }

    closesocket(socketClient);

    return 0;
}

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值