【发布时间】:2014-09-26 22:43:19
【问题描述】:
大家好,我一直在从一个简单的客户端接收两个地址然后使用异步套接字和 WINAPI 将它们打印出来的服务器上工作,到目前为止我已经设置了窗口并且已经能够接受连接但是当我尝试向服务器发送两条消息时,它只收到一条消息,第二条失败。代码如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND hEdit = NULL;
int len = sizeof(Server);
switch (msg)
{
case WM_CREATE:
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
0, 0, WIDTH, HEIGHT, hwnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case 1111:
if (LOWORD(lParam) == FD_ACCEPT)
{
socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
socket = accept(sListen, (SOCKADDR*)&Server, &len);
print_line(hwnd, "IT WAS ACCEPTED!!!!!!!!\r\n");
}
if (LOWORD(lParam) == FD_CLOSE)
{
print_line(hwnd, "Client left the server!\r\n");
}
if (LOWORD(lParam) == FD_READ)
{
char NICK[4096] = { 0 };
char IP[4096] = { 0 };
ZeroMemory(NICK, strlen(NICK));
ZeroMemory(IP, strlen(IP));
if (recv(socket, IP, sizeof(IP), NULL) == INVALID_SOCKET)//get the IP address
{
print_line(hwnd, "Failed to recieve IP Address from socket!");
print_line(hwnd, "\r\n");
}
if (recv(socket, NICK, sizeof(NICK), NULL) == INVALID_SOCKET)//get the Nickname
{
print_line(hwnd, "Failed to recieve nickname from socket!");
print_line(hwnd, "\r\n");
}
//prints the Username and IP address to the window screen
print_line(hwnd, "Username: ");
print_line(hwnd, NICK);
print_line(hwnd, "\r\n");
print_line(hwnd, "IP Address: ");
print_line(hwnd, IP);
print_line(hwnd, "\r\n");
}
break;
default:
HWND hEdit;
RECT rcClient;
GetClientRect(hwnd, &rcClient);
hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
}
【问题讨论】:
-
在第二次调用前检查错误并发布结果
-
@MarcoA。你的意思是第一个recv函数调用?如果这就是你的意思,我已经检查过了并且没有错误它会打印 IP 地址
-
抱歉,我的意思是:在第二次调用后检查错误,以便更详细地查看问题所在
-
@MarcoA。我将如何检查它我还没有通过尝试打印它来检查是否存在错误并且消息的缓冲区是空的?抱歉,如果这听起来像一个愚蠢的问题,我只是有点难以理解“第二次通话后检查错误”的意思。
-
没问题,我是想用WSAGetLastError获取失败后的错误码
标签: c++ sockets winapi network-programming