MFC中怎么用WSASend、WSARecv收发数据 MFC中怎么用WSASend、WSARecv收发数据.比如:用WSASend发送一个数据包到服务器,服务器返回一个数据包,使用WSARecv接收,然后再根据收到的内容在发送。MFC中怎么实现这一工程,请高人解答,不甚感激。有代码最好。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看《WinSock网络编程经络》或这里的例子:http://download.csdn.net/detail/geoff08zhang/4571358 void CALLBACK CompletionROUTINE( IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags);#ifndef UNICODE#define UNICODE#endif#ifndef WIN32_LEAN_AND_MEAN#define WIN32_LEAN_AND_MEAN#endif#include <Windows.h>#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <stdlib.h>// Need to link with Ws2_32.lib#pragma comment(lib, "ws2_32.lib")#pragma warning(disable: 4127) // Conditional expression is a constant#define DATA_BUFSIZE 4096int __cdecl main(int argc, char **argv){ WSADATA wsd; struct addrinfo *result = NULL, *ptr = NULL, hints; WSAOVERLAPPED RecvOverlapped; SOCKET ConnSocket = INVALID_SOCKET; WSABUF DataBuf; DWORD RecvBytes, Flags; char buffer[DATA_BUFSIZE]; int err = 0; int rc; if (argc != 2) { wprintf(L"usage: %s server-name\n", argv[0]); return 1; } // Load Winsock rc = WSAStartup(MAKEWORD(2, 2), &wsd); if (rc != 0) { wprintf(L"Unable to load Winsock: %d\n", rc); return 1; } // Make sure the hints struct is zeroed out SecureZeroMemory((PVOID) & hints, sizeof (struct addrinfo)); // Initialize the hints to retrieve the server address for IPv4 hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; rc = getaddrinfo(argv[1], "27015", &hints, &result); if (rc != 0) { wprintf(L"getaddrinfo failed with error: %d\n", rc); return 1; } for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { ConnSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnSocket == INVALID_SOCKET) { wprintf(L"socket failed with error: %d\n", WSAGetLastError()); freeaddrinfo(result); return 1; } rc = connect(ConnSocket, ptr->ai_addr, (int) ptr->ai_addrlen); if (rc == SOCKET_ERROR) { if (WSAECONNREFUSED == (err = WSAGetLastError())) { closesocket(ConnSocket); ConnSocket = INVALID_SOCKET; continue; } wprintf(L"connect failed with error: %d\n", err); freeaddrinfo(result); closesocket(ConnSocket); return 1; } break; } if (ConnSocket == INVALID_SOCKET) { wprintf(L"Unable to establish connection with the server!\n"); freeaddrinfo(result); return 1; } wprintf(L"Client connected...\n"); // Make sure the RecvOverlapped struct is zeroed out SecureZeroMemory((PVOID) & RecvOverlapped, sizeof (WSAOVERLAPPED)); // Create an event handle and setup an overlapped structure. RecvOverlapped.hEvent = WSACreateEvent(); if (RecvOverlapped.hEvent == NULL) { wprintf(L"WSACreateEvent failed: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ConnSocket); return 1; } DataBuf.len = DATA_BUFSIZE; DataBuf.buf = buffer; // Call WSARecv until the peer closes the connection // or until an error occurs while (1) { Flags = 0; rc = WSARecv(ConnSocket, &DataBuf, 1, &RecvBytes, &Flags, &RecvOverlapped, NULL); if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) { wprintf(L"WSARecv failed with error: %d\n", err); break; } rc = WSAWaitForMultipleEvents(1, &RecvOverlapped.hEvent, TRUE, INFINITE, TRUE); if (rc == WSA_WAIT_FAILED) { wprintf(L"WSAWaitForMultipleEvents failed with error: %d\n", WSAGetLastError()); break; } rc = WSAGetOverlappedResult(ConnSocket, &RecvOverlapped, &RecvBytes, FALSE, &Flags); if (rc == FALSE) { wprintf(L"WSARecv operation failed with error: %d\n", WSAGetLastError()); break; } wprintf(L"Read %d bytes\n", RecvBytes); WSAResetEvent(RecvOverlapped.hEvent); // If 0 bytes are received, the connection was closed if (RecvBytes == 0) break; } WSACloseEvent(RecvOverlapped.hEvent); closesocket(ConnSocket); freeaddrinfo(result); WSACleanup(); return 0;} opengl摄像机坐标系的问题 如何获取字符个数?? 有人用doxys自动生成文档吗?貌似不支持中文注释? 偶然看到一个宏定义,不明白什么意思,望指教。 如何用位图来改变工具栏背景?? 请指点迷津 求教 VS2005+Oracle 的图片存储问题。 300悬赏求解(每个50)!! 各位兄弟姐妹,请教通信行业 Call center 的前景如何? 如何重载一个CEdit 请问如何获取电脑里最后一个硬盘分区的盘符
http://download.csdn.net/detail/geoff08zhang/4571358
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
#ifndef UNICODE
#define UNICODE
#endif#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif#include <Windows.h>#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")#pragma warning(disable: 4127) // Conditional expression is a constant#define DATA_BUFSIZE 4096int __cdecl main(int argc, char **argv)
{
WSADATA wsd;
struct addrinfo *result = NULL, *ptr = NULL, hints;
WSAOVERLAPPED RecvOverlapped;
SOCKET ConnSocket = INVALID_SOCKET;
WSABUF DataBuf;
DWORD RecvBytes, Flags;
char buffer[DATA_BUFSIZE]; int err = 0;
int rc; if (argc != 2) {
wprintf(L"usage: %s server-name\n", argv[0]);
return 1;
}
// Load Winsock
rc = WSAStartup(MAKEWORD(2, 2), &wsd);
if (rc != 0) {
wprintf(L"Unable to load Winsock: %d\n", rc);
return 1;
}
// Make sure the hints struct is zeroed out
SecureZeroMemory((PVOID) & hints, sizeof (struct addrinfo)); // Initialize the hints to retrieve the server address for IPv4
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP; rc = getaddrinfo(argv[1], "27015", &hints, &result);
if (rc != 0) {
wprintf(L"getaddrinfo failed with error: %d\n", rc);
return 1;
} for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { ConnSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnSocket == INVALID_SOCKET) {
wprintf(L"socket failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
return 1;
} rc = connect(ConnSocket, ptr->ai_addr, (int) ptr->ai_addrlen);
if (rc == SOCKET_ERROR) { if (WSAECONNREFUSED == (err = WSAGetLastError())) {
closesocket(ConnSocket);
ConnSocket = INVALID_SOCKET;
continue;
}
wprintf(L"connect failed with error: %d\n", err);
freeaddrinfo(result);
closesocket(ConnSocket);
return 1;
}
break;
}
if (ConnSocket == INVALID_SOCKET) {
wprintf(L"Unable to establish connection with the server!\n");
freeaddrinfo(result);
return 1;
} wprintf(L"Client connected...\n"); // Make sure the RecvOverlapped struct is zeroed out
SecureZeroMemory((PVOID) & RecvOverlapped, sizeof (WSAOVERLAPPED)); // Create an event handle and setup an overlapped structure.
RecvOverlapped.hEvent = WSACreateEvent();
if (RecvOverlapped.hEvent == NULL) {
wprintf(L"WSACreateEvent failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ConnSocket);
return 1;
} DataBuf.len = DATA_BUFSIZE;
DataBuf.buf = buffer; // Call WSARecv until the peer closes the connection
// or until an error occurs
while (1) { Flags = 0;
rc = WSARecv(ConnSocket, &DataBuf, 1, &RecvBytes, &Flags, &RecvOverlapped, NULL);
if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) {
wprintf(L"WSARecv failed with error: %d\n", err);
break;
} rc = WSAWaitForMultipleEvents(1, &RecvOverlapped.hEvent, TRUE, INFINITE, TRUE);
if (rc == WSA_WAIT_FAILED) {
wprintf(L"WSAWaitForMultipleEvents failed with error: %d\n", WSAGetLastError());
break;
} rc = WSAGetOverlappedResult(ConnSocket, &RecvOverlapped, &RecvBytes, FALSE, &Flags);
if (rc == FALSE) {
wprintf(L"WSARecv operation failed with error: %d\n", WSAGetLastError());
break;
} wprintf(L"Read %d bytes\n", RecvBytes); WSAResetEvent(RecvOverlapped.hEvent); // If 0 bytes are received, the connection was closed
if (RecvBytes == 0)
break;
} WSACloseEvent(RecvOverlapped.hEvent);
closesocket(ConnSocket);
freeaddrinfo(result); WSACleanup(); return 0;
}