7,539
社区成员




客户端代码:
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函数不成功,各位大侠,什么原因呢?
问题已解决,谢谢楼上大侠:)
额,兄弟。。。你这代码中客户端使用的是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() 来接收客户端发送的数据包。