C++Socket解决方案

C++ Socket 解决方案

本人编程“小白”一个。

inet_addr()函数过旧问题

在VS高版本里inet_addr()会报错,小编不推荐关闭SDL检查,而是使用inet_pton()或者inet_ntop()
具体用法见:
inet_pton()百度百科
inet_ntop()百度百科

inet_pton(地址系, "IP地址", (void*强制转换)&socket名称.sin_addr);
inet_ntop(地址系, "IP地址", (void*强制转换)&socket名称.sin_addr)

完整代码

服务器代码

//Server
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>

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

using namespace std;

int main() {
    WSADATA wsaData;
    int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0) {
        cout << "初始化套接字失败!" << endl;
        system("pause");
        return 0;
    }
    else
        cout << "初始化套接字成功!" << endl;

    SOCKET serverSock = socket(PF_INET, SOCK_STREAM, 0);
    sockaddr_in serverAddr;
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = PF_INET;
    serverAddr.sin_port = htons(5000);
    
    inet_pton(PF_INET, "127.0.0.1", (void*)&serverAddr.sin_addr);
    //或者inet_ntop
	//重点,使用inet_addr在高版本VS会报错

    bind(serverSock, (SOCKADDR*)&serverAddr, sizeof(SOCKADDR));
    cout << "绑定套接字成功!" << endl;
    listen(serverSock, 20);
    sockaddr clientAddr;
    int size = sizeof(SOCKADDR);
    cout << "accept函数!" << endl;
    SOCKET clientSock = accept(serverSock, (SOCKADDR*)&clientAddr, &size);

    char buffer[30];
    memset(&buffer, '/0', sizeof(buffer));
    cout << "输入一句话:" << endl;
    cin >> buffer;
    send(clientSock, buffer, strlen(buffer) + sizeof(char), NULL);
    cout << "数据发送成功!" << endl;

    closesocket(clientSock);
    closesocket(serverSock);
    WSACleanup();
    system("pause");
    return 0;
}

客户端代码

//Client
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>

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

using namespace std;

int main() {
    WSADATA wsaData;
    int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0) {
        cout << "初始化套接字失败!" << endl;
        system("pause");
        return 0;
    }
    else
        cout << "初始化套接字成功!" << endl;
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, 0);
    sockaddr_in clientAddr;
    memset(&clientAddr, 0, sizeof(clientAddr));
    clientAddr.sin_family = PF_INET;
    clientAddr.sin_port = htons(5000);
    
    inet_pton(PF_INET, "127.0.0.1", (void*)&ClientAddr.s_addr);
    //或者inet_ntop
	//重点,使用inet_addr在高版本VS会报错
	
    printf("客户端发送请求\n");
    connect(clientSock, (SOCKADDR*)&clientAddr, sizeof(SOCKADDR));
    char buffer[MAXBYTE] = { 0 };
    recv(clientSock, buffer, MAXBYTE, NULL);

    cout << "接收服务器消息" << endl;
    cout << "服务器:" << buffer << endl;
    closesocket(clientSock);
    WSACleanup();
    system("pause");
    return 0;
}

另外一种解法

在.cpp第一行前插入

#define _WINSOCK_DEPRECATED_NO_WARNINGS

也可以完美解决。

返回顶端

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值