#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#pragma   comment(lib,"ws2_32.lib")
#define PORT 5150#define WM_SOCKET (WM_USER + 1)
HWND MakeWorkerWindow(void);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);LPSOCKET_INFORMATION SocketInfoList;void main(void)
{
   MSG msg;
   DWORD Ret;
   SOCKET Listen;
   SOCKADDR_IN InternetAddr;
   HWND Window;
   WSADATA wsaData;   if ((Window = MakeWorkerWindow()) == NULL)
      return;
   if ((Ret = WSAStartup(0x0202, &wsaData)) != 0)
   {
      printf("WSAStartup failed with error %d\n", Ret);
      return;
   }   if ((Listen = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
   {
      printf("socket() failed with error %d\n", WSAGetLastError());
      return;
   }    WSAAsyncSelect(Listen, Window, WM_SOCKET, FD_ACCEPT|FD_CLOSE);   InternetAddr.sin_family = AF_INET;
   InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   InternetAddr.sin_port = htons(PORT);   if (bind(Listen, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
   {
      printf("bind() failed with error %d\n", WSAGetLastError());
      return;
   }   if (listen(Listen, 5))
   {
      printf("listen() failed with error %d\n", WSAGetLastError());
      return;
   }
     
   // Translate and dispatch window messages for the application thread   while(Ret = GetMessage(&msg, NULL, 0, 0))
   {
      if (Ret == -1)
      {
         printf("GetMessage() failed with error %d\n", GetLastError());
         return;
      }      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   SOCKET Accept;
   LPSOCKET_INFORMATION SocketInfo;
   DWORD RecvBytes, SendBytes;
   DWORD Flags;   if (uMsg == WM_SOCKET)
   {
      if (WSAGETSELECTERROR(lParam))
      {
         printf("Socket failed with error %d\n", WSAGETSELECTERROR(lParam));
         FreeSocketInformation(wParam);
      } 
      else
      {
         switch(WSAGETSELECTEVENT(lParam))
         {
            case FD_ACCEPT:               if ((Accept = accept(wParam, NULL, NULL)) == INVALID_SOCKET)
               {
                  printf("accept() failed with error %d\n", WSAGetLastError());
                  break;
               }
                          printf("Socket number %d connected\n", Accept);               WSAAsyncSelect(Accept, hwnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);               break;            case FD_READ:
                  printf("有数据输入!\n");
                  int Rec = recv(Accept, buf, sizeof(buf), NULL);
                  buf[Rec] = '\0';
                  if (Rec > 0)
                  {
                        printf("%s", buf);
                  } 
                  break;           
           
         }
      }
      return 0;
   }   return DefWindowProc(hwnd, uMsg, wParam, lParam);
}HWND MakeWorkerWindow(void)
{
   WNDCLASS wndclass;
   CHAR *ProviderClass = "AsyncSelect";
   HWND Window;   wndclass.style = CS_HREDRAW | CS_VREDRAW;
   wndclass.lpfnWndProc = (WNDPROC)WindowProc;
   wndclass.cbClsExtra = 0;
   wndclass.cbWndExtra = 0;
   wndclass.hInstance = NULL;
   wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
   wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
   wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
   wndclass.lpszMenuName = NULL;
   wndclass.lpszClassName = ProviderClass;   if (RegisterClass(&wndclass) == 0)
   {
      printf("RegisterClass() failed with error %d\n", GetLastError());
      return NULL;
   }   // Create a window.   if ((Window = CreateWindow(
      ProviderClass,
      "",
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      NULL,
      NULL,
      NULL,
      NULL)) == NULL)
   {
      printf("CreateWindow() failed with error %d\n", GetLastError());
      return NULL;
   }  //ShowWindow   (Window,NULL)   ;   
  //UpdateWindow   (Window)   ;      return Window;
}

解决方案 »

  1.   

    使用另一个程序,用connect函数与send函数进行连接和发送数据后,只能显示“有数据输入!”,而输入的具体数据没办法接收,请问是什么原因,谢谢!
      

  2.   

    int Rec = recv(Accept, buf, sizeof(buf), NULL); 改为
    int Rec = recv((SOCKET)wParam,buf, sizeof(buf), NULL);
      

  3.   

    SOCKET Accept只是局部变量,如果你执意要用int Rec = recv(Accept, buf, sizeof(buf), NULL); 
    将SOCKET Accpet改为全局变量会没问题.