Winsocks 2异步问题
Winsocks 2 Asynchronous Problem
我试图在异步模式下使用winsock2。我能够从客户机发送消息到服务器,但不能从服务器发送消息到客户机。当我在客户端调用recv时,缓冲区中没有收到任何内容。
这是我的客户端代码
ClientSocket::ClientSocket (HWND& pHwnd)
{
WSADATA wsdata;
vSzIncoming = 0;
int error = WSAStartup (MAKEWORD(2,2), &wsdata);
vSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
error = WSAAsyncSelect (vSocket, pHwnd, WM_SOCKET, (FD_CLOSE | FD_READ));
vHwnd = pHwnd;
vIsConnected = false;
}
bool ClientSocket::ConnectToServer ()
{
SockAddr.sin_port = htons (20000);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = inet_addr ("127.0.0.1");
if(connect (vSocket, (LPSOCKADDR)(&SockAddr), sizeof (SockAddr)) == SOCKET_ERROR) {
vIsConnected = false;
return false;
}
vIsConnected = true;
return true;
}
void ClientSocket::SendMsg (const MessageGenerator& pMessageGenerator)
{
send(vSocket, pMessageGenerator.GetMessage ().Buffer (), pMessageGenerator.GetLength (), 0);
}
char * ClientSocket::ReceiveMsg ()
{
char temp[1024];
ZeroMemory (temp, sizeof (temp));
int inDataLength = recv (vSocket,
(char*)temp,
sizeof (temp) / sizeof (temp [0]),
0);
return temp;
}
这是服务器代码
WSADATA WsaDat;
int nResult=WSAStartup(MAKEWORD(2,2),&WsaDat);
Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN SockAddr;
SockAddr.sin_port=htons(nPort);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(Socket,(LPSOCKADDR)&SockAddr,sizeof(SockAddr))==SOCKET_ERROR)
{
}
nResult=WSAAsyncSelect(Socket,
hWnd,
WM_SOCKET,
(FD_CLOSE|FD_ACCEPT|FD_READ));
if(listen(Socket,(1))==SOCKET_ERROR)
{
}
//发送部分String str ="1;yahoo;|";
send(Socket,str.Buffer(),str.GetLength(),0);
//接收部分case WM_SOCKET:
{
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char szIncoming[1024];
ZeroMemory(szIncoming,sizeof(szIncoming));
int inDataLength=recv(Socket,
(char*)szIncoming,
sizeof(szIncoming)/sizeof(szIncoming[0]),
0);
String str(szIncoming);
wcsncat(szHistory,str.GetTChar(),inDataLength);
wcscat(szHistory,L"rn");
SendMessage(hEditIn,
WM_SETTEXT,
sizeof(szIncoming)-1,
reinterpret_cast<LPARAM>(&szHistory));
}
case FD_ACCEPT:
{
int size=sizeof(sockaddr);
Socket=accept(wParam,&sockAddrClient,&size);
}
请帮帮我
很难说你的问题在哪里。最好的解决方案是系统地清除所有可能的障碍:
- 查看
recv
的返回值。如果有一个错误,你的缓冲区是不变的,所以一个"空"字符串返回。 - 检查服务器端是否使用了正确的客户端套接字。您使用"Socket"变量名的次数太多。最好是区分客户端套接字和服务器套接字。另外:如何存储客户端套接字?这是全局变量还是静态变量?您确定这个值是正确的吗?(这一点主要是为您的服务器端代码) 用日志扩展你的代码,这样你就可以跟踪客户端和服务器端发生的事情。调试器也可以帮助你。
还有一个相当大的错误,你应该立即纠正在你的代码:
char * ClientSocket::ReceiveMsg ()
{
char temp[1024];
ZeroMemory (temp, sizeof (temp));
int inDataLength = recv (vSocket,
(char*)temp,
sizeof (temp) / sizeof (temp [0]),
0);
return temp; // ** don't return a local memory "object" **
}
不要那样做。要么使用_strdup返回一个副本,要么使用并返回你的"String"对象。当然,如果使用_strdup
,调用者必须使用适当的函数(free
)释放内存。啊,是的,第三种可能性是只期望缓冲区作为一个参数,就像recv已经做的那样。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- 我有一个关于C++提升的问题:: asio 和 std :: 异步
- 服务器/客户端TCP异步(winsock)//FD_WRITE问题
- Linux异步IO与libaio性能问题
- Winsocks 2异步问题