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

smily233 smily233 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

客户端代码:

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函数不成功,各位大侠,什么原因呢?

...全文

相关推荐

vc2010下使用CAsyncSocket的例子

根据从这里下载的文件做了几处Bug修改,并转为vc2010格式 http://download.csdn.net/download/chengbar/3617997

蓝白的天空

VC6.0下Winsock网络编程实战:从Socket到TCP服务器客户端

套接字(Socket)是网络编程的基石,它屏蔽了底层协议的细节,让开发者能够像操作文件一样进行网络数据收发。在TCP/IP协议栈中,一次通信需要经历建连、传输、断连三个阶段,对应到Winsock API正是WSAStartup初始化、socket创建、bind绑定、listen监听、accept接受连接、以及send/recv收发数据这一整套流程。理解这些基础接口的调用逻辑,是掌握更高层框架(如Python socket、Java ServerSocket)的前提。无论是独立开发一个简单的回显服务器,还是调

菩提风

VC6.0手写TCP Socket通信:服务器与客户端从零实现

网络通信是现代软件开发的基石,而TCP/IP协议栈作为互联网的核心,其底层编程模型被称为Socket套接字。理解Socket的工作机制,包括建立连接、数据传输、阻塞与非阻塞等概念,是深入掌握网络编程的关键。通过手动实现底层细节,如Winsock库初始化、字节序转换、端口绑定等,开发者能更扎实地理解网络通信原理。这种能力在实际工程中具有重要价值,无论是调试网络问题、设计高性能服务器,还是维护遗留系统,都离不开对Socket底层逻辑的把握。本文以经典开发环境VC6.0为例,逐步演示如何实现一个完整的TCP回声服

邦成为寄卖连锁

vc ,socket编程含客户端和服务端

vc ,socket编程含客户端和服务端

baominhao123

vc telnet 编程

vc telnet 编程

german010
评论 2
收藏 已收藏
分享
返回顶部
smily233
VC.NET 7,538 成员 27,670 内容