零分伟 2019-11-11 15:05 采纳率: 0%
浏览 552

C++基础tcp通信练习问题 客户端连接服务端失败 返回值10038 求答

客户端代码

#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#include<windows.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
    //启动Windows socket2.x环境
    WORD ver = MAKEWORD(2, 2);
    WSADATA dat;
    WSAStartup(ver, &dat);
    ///-----------------
    //1 建立一个socket
    SOCKET _sock = (AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == _sock)
    {
        printf("error sock\n");
    }
    else
    {
        printf("success sock\n");
    }
    //2 连接服务器 connect
    sockaddr_in _sin = {};
    _sin.sin_family = AF_INET;
    _sin.sin_port = htons(1234);
    _sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    int ret = connect(_sock, (sockaddr*)&_sin, sizeof(_sin));
    if (SOCKET_ERROR == ret)
    {
        printf("error connect\n");
    }
    else
    {
        printf("success connect\n");
    }
    //3 接收服务器信息 recv
    char recvBuf[256] = {};
    int nlen = recv(_sock, recvBuf, 256, 0);
    if (nlen > 0)
    {
        printf("recv:%s", recvBuf);
    }
    //4 关闭 closesocket
    closesocket(_sock);
    ///-----------------
    WSACleanup();
    getchar();
    return 0;
}

服务端代码

#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#include<windows.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
    //启动Windows socket2.x环境
    WORD ver = MAKEWORD(2, 2);
    WSADATA dat;
    WSAStartup(ver, &dat);
    ///-----------------
    //1 建立一个socket
    SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //2 bind 绑定用于接受客户端连接的网络端口
    sockaddr_in _sin = {};
    _sin.sin_family = AF_INET;
    _sin.sin_port = htons(1234);//htons = host to net unsigned short
    _sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");
    if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin)))
    {
        printf("bind error\n");
    }
    else
    {
        printf("bind success\n");
    }
    //3 listen 监听网络端口
    if (SOCKET_ERROR == listen(_sock, 5))
    {
        printf("listen error\n");
    }
    else
    {
        printf("listen success\n");
    }
    //4 accept 等待接受客户端连接
    sockaddr_in clientAddr = {};
    int nAddrLen = sizeof(sockaddr_in);
    SOCKET _cSock = INVALID_SOCKET;
    char msgBuf[] = "can't find work";
    while (true)
    {
        _cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen);
        if (INVALID_SOCKET == _cSock)
        {
            printf("client error\n");
        }
        printf("new client: ip = %s \n", inet_ntoa(clientAddr.sin_addr));
        //5 send 向客户端发送一条数据

        send(_cSock, msgBuf, strlen(msgBuf) + 1, 0);
    }

    //6 closeSocket 关闭
    closesocket(_sock);
    ///-----------------
    //清除Windows socket 环境
    WSACleanup();
    return 0;
}

运行结果
图片说明

求大神解答!!!!
///////////////////////////////////
再使用了GetLastError后返回的值是10038

  • 写回答

1条回答 默认 最新

  • 虛擬時間SOS 2019-11-11 16:01
    关注

    //创建套接字(与服务端保持一致)

    //1 建立一个socket
    SOCKET _sock = (AF_INET, SOCK_STREAM, 0);

    //1 建立一个socket
    SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    有以下定义
    /*

    • Protocols / #define IPPROTO_IP 0 / dummy for IP / #define IPPROTO_ICMP 1 / control message protocol / #define IPPROTO_IGMP 2 / internet group management protocol / #define IPPROTO_GGP 3 / gateway^2 (deprecated) / #define IPPROTO_TCP 6 / tcp / #define IPPROTO_PUP 12 / pup / #define IPPROTO_UDP 17 / user datagram protocol / #define IPPROTO_IDP 22 / xns idp / #define IPPROTO_ND 77 / UNOFFICIAL net disk proto / #define IPPROTO_RAW 255 / raw IP packet */ #define IPPROTO_MAX 256

    
    
    
    WSADATA WSAData;
    if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR)  //WSAStartup()函数对Winsock DLL进行初始化
    {
    printf("Socket initialize fail!\n");
    continue;
    }
    /*
    * windows下使用socket必须用WSAStartup初始化,否则不能调用
    */
    if (WSAStartup(MAKEWORD(2, 2), &WSAData)) //加载socket 2.2通讯协议库
    {
    printf("WSA failed\n");
    return -1;
    }
    
    SOCKET sock; //客户端进程创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)  //创建流套接字(与服务端保持一致)
    {
    printf("Socket create fail!\n");
    WSACleanup();
    continue;
    }
    
    #pragma warning(disable : 4996)
    struct hostent* host_addr = gethostbyname(IP);
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons((unsigned short)PORT);
    sin.sin_addr.s_addr = *((unsigned long*)*host_addr->h_addr_list);
    
    
    if (connect(sock, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)  //调用connect()函数,向服务器进程发出连接请求  
    {
    printf("Connect fail!\n");
    closesocket(sock);
    WSACleanup();
    continue;
    }
    int ret = send(sock, sndBuf, strlen(sndBuf) + 1, 0);                 //向服务器发送数据 
    //循环读取
    ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
    
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)