MFC中怎么用WSASend、WSARecv收发数据.比如:用WSASend发送一个数据包到服务器,服务器返回一个数据包,使用WSARecv接收,然后再根据收到的内容在发送。MFC中怎么实现这一工程,请高人解答,不甚感激。有代码最好。

解决方案 »

  1.   

    看看《WinSock网络编程经络》或这里的例子:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  2.   

    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;
    }