windows客户端和linux服务端下的c++ tcp socket demo

window下的客户端
参考文档 安装MinGW:
https://blog.csdn.net/weixin_43141320/article/details/114487461

CMakeLists.txt
添加,要在add_executable前面
link_libraries(ws2_32 wsock32)

tcp socket 客户端如下:

#include <iostream>
#include <string>
#include <cstring>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main() {
        cout << "测试开始了!" << endl;
    SOCKET clientsocket;
    SOCKADDR_IN serveraddr;
    SOCKADDR_IN clientaddr;
    char buf[1024];

    WSADATA wsa;
    WSAStartup(MAKEWORD(2,0),&wsa);    //初始化WS2_32.DLL

    //创建套接字
    if((clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)
    {
        printf("套接字socket创建失败!\n");
        return -1;
    }

    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(8888); //
    serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    //请求连接
    printf("尝试连接中...\n");
    if(connect(clientsocket, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0)
    {
        printf("连接失败!\n");
        return -1;
    }
    printf("连接成功!\n");

    //发送数据
    printf("请输入发送给服务器的字符:\n");
    scanf("%s", buf);

    if(send(clientsocket, buf, sizeof(buf), 0)<=0)
//        if(send(clientsocket, buf, strlen(buf)+1, 0)<=0)
    {
        printf("发送错误!\n");
    }

    //接收数据  这里是同步处理发送后的接收,如果需要大数据量,可以接收改成异步
    while(1){
        if(recv(clientsocket, buf, 1024, 0) <= 0)
        {
            printf("关闭连接!\n");
            //closesocket(clientsocket);
            break;
        }
        printf("接收来自服务器的信息: %s\n",buf);
        //break;
    }
    //关闭套接字
    closesocket(clientsocket);
    WSACleanup();    //释放WS2_32.DLL
    return 0;
}

Linux 下的服务端 tcp socket如下:

#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <cstring>

//创建接受数据的socket
    int iConn = 0;
    int ist = socket(AF_INET,SOCK_STREAM,0);
    printf("socket ss:%d \n",ist);
    struct sockaddr_in server_sockaddr;

    //配置sockaddr_in 结构体中相关参数
    server_sockaddr.sin_family = AF_INET;
    server_sockaddr.sin_port = htons(CARSOCKETPORT);
    printf("INADDR_ANY:%d \n",INADDR_ANY);
    server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    int on = 1;
    if(setsockopt(ist, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)) < 0){
        perror("setsockopt error");;
        exit(1);
    }

    if(-1 == bind(ist,(struct sockaddr*)&server_sockaddr,sizeof(server_sockaddr)) ){
        perror("bind error");;
        exit(1);
    }

    if(-1 == listen(ist,100)){
        perror("bind listen");
        exit(-1);
    }

    while (1){
        struct sockaddr_in client_addr;
        socklen_t length = sizeof(client_addr);

        //成功返回非负描述字,出错返回-1
        iConn = accept(ist,(struct sockaddr*)&client_addr,&length);
        if(iConn < 0){
            perror("connect error");
            exit(1);
        }else{
            cout<<"one connect in"<<endl;
        }

        char addr[16];
        memset(addr, 0, sizeof(addr));
        strcpy(addr, inet_ntoa(client_addr.sin_addr));

        cout << "client ip:" << addr << ";port:" << client_addr.sin_port << endl;

        char buffer[1024];

        memset(buffer,0,sizeof(buffer));
        
//这里是同步处理发送后的接收,如果需要大数据量,可以改成异步
        int len = recv(iConn, buffer, sizeof(buffer), 0);
        if(len <= 0){
            cout<<"recv failed."<<endl;
            close(iConn); //accept函数连接成功后还会生成一个新的套接字描述符,这里需要关闭
        //break;
        }else{
//        printf("recv buffer %s",buffer);
            cout<<"recv buffer:"<<buffer<<endl;
            struct Data temp;
            memset(&temp,0,sizeof(temp));
            memcpy(&temp,buffer,sizeof(temp));            
        }

        //给客户端返回信息 本流程可以不用返回信息
//        send(iConn, buffer, len ,0);
    }

   close(iConn); //accept函数连接成功后还会生成一个新的套接字描述符,这里需要关闭
    close(ist); // 关闭套接子描述副

linux客户端 tcp socket如下:,如下:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <thread>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <cstring>



// 创建一个socket
int s = socket(AF_INET, SOCK_STREAM, 0);
// 如果返回值为-1,则创建失败
if (s == -1)
{
cout << "create socket err" << endl;
return;
}

sockaddr_in server_addr;
server_addr.sin_port = htons(8080);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

// 连接对应地址的socket
if (connect(s, (sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("connection");
return ;
}

char buf[1024];
memset(buf, 0, sizeof(buf));

// 发送数据
if (send(s, buf, sizeof(buf), 0) == -1)
{
perror("send data err");
return ;
}

cout << "send msg " << buf << " successfully" << endl;
// 关闭socket
close(s);

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值