VC ,客户端connect成功,服务器端listen成功,但accept不成功,什么原因?代码如下:
客户端代码:
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编程含客户端和服务端
vc telnet 编程
vc telnet 编程


VC.NET
