VC ,客户端connect成功,服务器端listen成功,但accept不成功,什么原因?代码如下:

smily233 2024-05-29 12:32:50

客户端代码:

void CGridCtrlDemoDlg::OnWinsocket()//windows套接字
{
    WORD socketVersion = MAKEWORD(2, 2);
     WSADATA wsaData;
     if (WSAStartup(socketVersion, &wsaData) != 0)
         {
             return ;
         }
     /*SOCKET */sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

     sin3.sin_family = AF_INET;
     //sin3.sin_port = htons(4301);//这个地址需要改变////设定需要连接的服务器的端口地址
     int family = AF_INET; // 指定地址族
     const char* ip_str = "192.168.1.15"; // 要转换的IP地址字符串"fe80::1503:d8e9:755b:5c3a%5"
     unsigned char ip_bin[sizeof(struct in_addr)]; // 存储转换后的IP地址的缓冲区
     if (inet_pton(family, ip_str, (void*)&sin3.sin_addr.S_un.S_addr) != 1)
     {
         //return;
     }
     sin3.sin_port = htons(4301);//这个地址需要改变////设定需要连接的服务器的端口地址

     len = sizeof(sin3);

     if (connect(sclient, (sockaddr*)&sin3, sizeof(sin3)) == SOCKET_ERROR)
    {
        printf("connect error !");         
        closesocket(sclient);         
        return ;         
    }
    
     AfxBeginThread(ConnectFunc236, (LPVOID)this);
}

UINT  ConnectFunc236(LPVOID lpParam)//多线程函数
{
    while (true)
    {
        char* sendData = "来自客户端的数据包.\n";
        int bz = sendto(sclient, sendData, strlen(sendData), 0, (sockaddr*)&sin3, len);
        if (bz > 0)
        {
        }
    }

    closesocket(sclient);
    WSACleanup();
}
 

服务器端代码:

int len = sizeof(SOCKADDR);
sockaddr_in sin3;
int nAddrLen;

SOCKADDR_IN addrAccept;
SOCKET slisten;

void CMFCApplication2Dlg::OnWinSocket()//windows套接字
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
        return;
}

//创建套接字
slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
    printf("socket error !");
    return ;
}

//绑定IP和端口
//sockaddr_in sin;
sin3.sin_family = AF_INET;
int family = AF_INET; // 指定地址族
const char* ip_str = "192.168.1.15"; // 要转换的IP地址字符串"fe80::1503:d8e9:755b:5c3a%5"
unsigned char ip_bin[sizeof(struct in_addr)]; // 存储转换后的IP地址的缓冲区
if (inet_pton(family, ip_str, (void*)&sin3.sin_addr.S_un.S_addr) != 1)
{
    printf("地址 error !");
    return;
}
sin3.sin_port = htons(4301);//这个地址需要改变////设定需要连接的服务器的端口地址

if (bind(slisten, (LPSOCKADDR)&sin3, sizeof(sin3)) == SOCKET_ERROR)//对socket绑定端口号和IP地址

{
        printf("bind error !");
}

//开始监听
if (listen(slisten, 5) == SOCKET_ERROR)
{
    printf("listen error !");
    return;
}

// 设置为非阻塞模式
//设置为非阻塞方式连接//否则accept函数会停顿,无限期等下去
unsigned long ul = 1;
int err;
int ret = ioctlsocket(slisten, FIONBIO, (unsigned long*)&ul);
if (ret == SOCKET_ERROR)
{
    err = WSAGetLastError();
    closesocket(slisten);
    slisten = NULL;
    return;
}

AfxBeginThread(AcceptThread, (LPVOID)this);
AfxBeginThread(ConnectFunc231, (LPVOID)this);
}

UINT  ConnectFunc231(LPVOID lpParam)//多线程函数
{
    while (true)
    {
        char recvData[255];
        int ret = recvfrom(slisten, recvData, 255, 0, (sockaddr*)&addrAccept, &nAddrLen);
        if (ret > 0)
        {

        }

        char* sendData = "一个来自服务端的UDP数据包\n";
        int bz = sendto(slisten, sendData, strlen(sendData), 0, (sockaddr*)&addrAccept, nAddrLen);
        if (bz > 0)
        {

        }
    }
    //closesocket(serSocket);
    closesocket(slisten);
    WSACleanup();
}

//接收链接的线程
UINT AcceptThread(LPVOID lpParam)
{
    int addrlen = sizeof(SOCKADDR_IN);
    ZeroMemory(&addrAccept, addrlen);

    SOCKET sockAccept = INVALID_SOCKET;

    while (true)
    {
        if ((sockAccept = accept(slisten, (SOCKADDR*)&addrAccept, &addrlen)) == INVALID_SOCKET)
        {
            continue;
        }
        else
        {

        }
    }
}

 

附注:客户端、服务器端均已执行到3个while (true)循环处,但服务器端的accept函数不成功,各位大侠,什么原因呢?

...全文
203 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
smily233 2024-05-29
  • 打赏
  • 举报
回复

问题已解决,谢谢楼上大侠:)

何遇mirror 2024-05-29
  • 打赏
  • 举报
回复

额,兄弟。。。你这代码中客户端使用的是UDP协议(SOCK_DGRAM),而服务器端却在尝试使用TCP协议(SOCK_STREAM)进行监听和接受连接(listen() 和 accept() 函数)。客户端和服务器端两使用的协议不匹配吖~
要么客户端改:

SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 将SOCK_DGRAM改为SOCK_STREAM

但如果期望是UDP通信:则服务器端不应该调用 listen() 和 accept(),而是应该直接使用 recvfrom() 来接收客户端发送的数据包。

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧