windows下socket网络编程,写了两次都是运行到accept就卡住了,也不报错,为什么啊,求解答

#include <iostream>
#include <WinSock2.h>


using namespace std;
#pragma comment(lib,"ws2_32.lib")

int main()
{
    char recvbuf[1024];
    char sendbuf[1024];
    WSADATA wsadata;
    if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
    {
        cout << "wsastartup failed" << endl;
    }
    SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
    if (server == INVALID_SOCKET)
    {
        cout << "socket failed" << endl;
    }
    sockaddr_in seraddr;
    seraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(6666);
    int m = bind(server, (SOCKADDR*)&seraddr, sizeof(seraddr));
    

    if (m != 0)
    {
        cout << "bind failed" << endl;
    }
    listen(server, 5);
    cout << 1 << endl;
    sockaddr_in client;
    int len = sizeof(client);
    SOCKET fd = accept(server, (sockaddr*)&client, &len);
    cout << 2 << endl;
    if (fd == INVALID_SOCKET)
    {
        cout << "accept failed" << endl;
    }
    cout << "请输入:" << endl;
    cin >> sendbuf;
    int l = send(fd, sendbuf, 1024, 0);
    if (l < 0)
    {
        cout << "send failed" << endl;
    }
    else {
        cout << "server 发送:" << sendbuf << endl;
    }
    int j = recv(fd, recvbuf, 1024, 0);
    if (j < 0)
    {
        cout << "recv failed" << endl;
    }
    else {
        cout << "server 收到:" << recvbuf << endl;
    }
    closesocket(server);
    closesocket(fd);
    WSACleanup();


    return 0;
}

对于Socket通信先确保防火墙什么的关闭了,之后通信代码你尝试执行一下:

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

#define SOCKET_PORT 8080

int main()
{

    int serverfd;
    if ((serverfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        printf("socket create error\n");
        return -1;
    }
    else
    {
        printf("socket create OK! \n");
    }

    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;  // IP 用通用的地址
    servaddr.sin_port = htons(SOCKET_PORT); // 指定通信端口必须用 htons

    if (-1 == bind(serverfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))
    {
        printf("bind error\n");
        close(serverfd);
        return -1;
    }
    else
    {
        printf("bind OK! \n");
    }

    if (-1 == listen(serverfd, 5))
    {
        printf("listen error\n");
        close(serverfd);
        return -1;
    }
    else
    {
        printf("listen stauts OK! \n");
    }

    struct sockaddr_in clientaddr;
    memset(&clientaddr, 0, sizeof(servaddr)); // 置零即可

    unsigned int socklen = sizeof(clientaddr); // 类型为 unsigned int

    printf("accept stauts before! \n");

    int clientfd = accept(serverfd, (struct sockaddr *)&clientaddr, &socklen);

    if (-1 == clientfd)
    {
        printf("accept error\n");
        close(serverfd);
        return -1;
    }
    else
    {
        printf("客户端(%s)已连接 \n", inet_ntoa(clientaddr.sin_addr));
    }

    char buffer[1024];
    while (1)
    {
        int ret;
        memset(buffer, 0, sizeof(buffer));
        if ((ret = recv(clientfd, buffer, sizeof(buffer), 0)) <= 0)
        {
            printf("ret = %d \n", ret);
            break;
        }

        printf("接收: %s \n", buffer);

        strcpy(buffer, "recv client req OK");
        if ((ret = send(clientfd, buffer, strlen(buffer), 0)) <= 0)
        {
            perror("send resp error");
            break;
        }

        printf("发送: %s \n", buffer);
    }
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define SOCKET_PORT 8080

int main()
{
    int ret = 0;
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sockfd)
    {
        printf("socket error \n");
        return -1;
    }
    else
    {
        printf("socket创建成功! \n");
    }

    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SOCKET_PORT);                // htons
    servaddr.sin_addr.s_addr = inet_addr("172.31.94.213"); // 换成你自己的ip

    ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    if (-1 == ret)
    {
        printf("connect error \n");
        close(sockfd);
        return -1;
    }
    else
    {
        printf("与服务端连接成功! \n");
    }

    char buffer[1024];
    for (int data_cnt = 0; data_cnt < 10; data_cnt++)
    {
        memset(buffer, 0, sizeof(buffer));
        sprintf(buffer, "创建第%d个socket通信,编号%03d \n", data_cnt + 1, data_cnt + 1);

        if ((ret = send(sockfd, buffer, strlen(buffer), 0)) <= 0) 
        {
            printf("send req error \n");
            break;
        }
        else
        {
            printf("发送:%s \n", buffer);
        }

        if ((ret = recv(sockfd, buffer, sizeof(buffer), 0)) <= 0)
        {
            printf("ret = %d \n", ret);
            break;
        }
        else
        {
            printf("接收: %s \n", buffer);
        }
    }

    printf("socket通信完成!");
    close(sockfd);
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 建议你看下这篇博客👉 :Windows网络编程(一):跨平台创建socket
  • 除此之外, 这篇博客: 网络编程-001-windows-socket中的 accept( 接收连接请求 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • 功能
      • 从监听 socket 的等待队列中抽取连接请求, 创建一个新的 socket 来与请求连接的客户端 socket 创建连接通道, 交换数据
      • 如果连接成功, 返回新创建的 socket 描述符
      • 若队列中没有连接请求, 当:
        • 阻塞方式时, 该函数阻塞调用它的进程。
        • 非阻塞方式时, 该函数返回一个错误代码
    • 定义

      SOCKET
      WSAAPI
      accept(
      _In_ SOCKET s,
      _Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR * addr,
      _Inout_opt_ int FAR * addrlen
      );
      • s 服务端的监听 socket
      • addr 客户端地址结构
      • addrlen 客户端地址长度
      • 返回值
        • 成功: 新的 socket 描述符
        • 失败: INVALID_SOCKET错误

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^