流程:
client: WSAStartup() -> socket() -> connect() _-> write()
server: WSAStartup() -> socket() -> bind()-> listen() -> accept() -> read()
其他都很简单
有问题看MSDN

解决方案 »

  1.   

    不好意思!
    我要完整的!
    编程的流程我知道!
    我可以用Console程序实现!
    但用Windows程序却实现不了!
    所以我要完整的代码,看看细节!
    请大家帮帮忙!
      

  2.   

    我也想知道啊,wengyu1000,你能不能把流程说一下,希望大家一起来帮忙!
      

  3.   

    to lbird(蓝鸟)
    你的来信我收到了!
    我不懂MFC,只会API
    很谢谢你的帮助!
    有没有API 的代码,越简单越好!
      

  4.   

    我没有用类啊,里面调用的都是API函数
    你有点MFC基础就可以看得懂
      

  5.   

    to lbird(蓝鸟) 
    好的,我劲力看看!
    有什么问题再问你!
    希望别介意!
      

  6.   

    我要下班了,
    只能给你发这么点(服务端程序)
    而且很简要,希望能对你有帮助,
    但你要知道SOCKET中WSAAsyncSelect模型才可以看得懂#define WM_SOCKET WM_USER+1
    ...int WINAPI WinMain(...)
    {
      SOCKET listen;
      SOCKADDR_IN InternetAddr
      HWND   Window;  Window=CreateWindow()
      listen=Socket();  InternetAddr.sin_family=AF_INET;
      InternetAddr.sin_addr.s_addr=htol(INADDR_ANY);  bind(listen,(PSOCKADDR)&InternetAddr,sizeof(nternetAddr));  WSAAsyncSelec(listen,Window,WM_SOCKET,
                 FD_ACCEPT|FD_CLOSE|FD_READ|FD_WRITE);
      listen(listen,5);}bool CALLBACK  WindowProc(...)
    {
      SOCKET  accept;
      switch(wMsg)
      {
      case WM_CREATE:
        ...
        break;
      case WM_SOCKET:
        switch(WSAGETSELECTEVENT(lParam))
        {
          case FD_ACCEPT:
            break;
           case FD_READ:
            break;
          case FD_WRITE:
            break;
          case  FD_CLOSE:
           break;
        }
    }
      

  7.   

    WSADATA ws; 
    SOCKET s; 
    struct sockaddr_in addr; 

    int iResult; 
    long lResult; 
    char strSubAddr[2024], strBuffer[100]; 

    lResult = WSAStartup(0x0101,&ws); 
    s = socket(AF_INET,SOCK_STREAM,0); 

    addr.sin_family = AF_INET; 
    addr.sin_port = htons(80); 
    addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); 
    iResult=connect(s,(struct sockaddr *) &addr, sizeof(addr)); 
    if(SOCKET_ERROR == iResult) 

    // 连接失败 
    WSACleanup(); 
    return FALSE; 


    // 连接成功
    strcpy(strSubAddr, "hello world"); 
    iResult = send(s, strSubAddr,strlen(strSubAddr),0); 
    strset(strBuffer,' '); 
    iResult = recv(s,strBuffer,sizeof(strBuffer),0); WSACleanup();
      

  8.   

    to lbird(蓝鸟) 
    明天我把我的代码贴上来,
    你帮我看看!
    也请大家帮忙!
      

  9.   

    double:
    你的程序没体现出窗口过程
    wengyu1000:
    明天来吧
      

  10.   

    大家好,我现在把我写的代码贴上来:
    请大家帮忙看看,有什么问题
    谢谢!
    /*------------------------------------------------------------
       服务器端代码,接受一个“hello”,并用TextOut()显示
      ------------------------------------------------------------*/#include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #define WM_SOCKET (WM_USER + 1)
     SOCKET      servAccept;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
     SOCKET       servListen;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HelloWin") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;  WSADATA wsaData;
     int   err;
     struct sockaddr_in localAddr;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
         
         hwnd = CreateWindow (szAppName,                  // window class name
                              TEXT ("The Hello Program"), // window caption
                              WS_OVERLAPPEDWINDOW,        // window style
                              200,              // initial x position
                              200,              // initial y position
                              200,              // initial x size
                              200,              // initial y size
                              NULL,                       // parent window handle
                              NULL,                       // window menu handle
                              hInstance,                  // program instance handle
                              NULL) ;                     // creation parameters
         
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;  //初始化套接字
     err= WSAStartup (MAKEWORD (2, 2), &wsaData);
    if(err!=0)
    {
    MessageBox (NULL,"初始化套阶字失败","err",0);
    return  FALSE;
    }
    //创建服务端套阶字
    servListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(servListen==INVALID_SOCKET)
    {
    MessageBox(NULL,"创建套阶字失败","err",0);
    WSACleanup();
    return FALSE;
    }
    //绑定到本地的一个断口上
    localAddr.sin_family=AF_INET;
    localAddr.sin_port=htons(1000);
    localAddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.167");
                                       //这是我机器的IP
    if(bind(servListen,(struct sockaddr *)&localAddr,
    sizeof(localAddr))==SOCKET_ERROR)
    {
    MessageBox(NULL,"地址绑定失败","err",0);
    WSACleanup();
    return FALSE;
    } //调用WSAAsyncSelect()函数
    err = WSAAsyncSelect (servListen, hwnd, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
    if(err != 0)
    {
    MessageBox( NULL, "调用WSAAsyncSelect()失败","err",0);
    } //侦听客户端的连接
    listen(servListen,5);     
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         HDC         hdc ;  TCHAR       Buffer[10];
     int         retval ,fromlen; 
     struct sockaddr_in fromAddr;     
         switch (message)
         {
         case WM_SOCKET:
     if ( WSAGETSELECTERROR(lParam))
     {
     closesocket( wParam);
     break;
     }  switch(WSAGETSELECTEVENT (lParam))
     {
     case FD_ACCEPT:
     // 接受连接
     fromlen=sizeof(fromAddr);
     servAccept = accept (wParam, (struct sockaddr*)&fromAddr,
    &fromlen);  //调用WSAAsyncSelect()函数
     WSAAsyncSelect (servAccept, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);
     break;  case FD_READ:
     //接受数据并打印出来
     retval = recv (servAccept,Buffer,sizeof(Buffer),0);  if(retval != 0)
    MessageBox(NULL,"OK","ok",0);  hdc = GetDC(hwnd);
     TextOut(hdc, 0, 0, TEXT(Buffer), strlen (Buffer ));
     ReleaseDC(hwnd, hdc );
     break;  case FD_CLOSE:
     closesocket (wParam);
     break;
     }  return 0;
     
                 
         case WM_DESTROY:
      closesocket(servListen);
      WSACleanup();
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
      

  11.   

    /*------------------------------------------------------------
       客户端代码,传输一个"hello"给服务器,并用TextOut()显示
      ------------------------------------------------------------*/#include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #define WM_SOCKET (WM_USER + 1)LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
     SOCKET       clientSocket;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HelloWin") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
       WSADATA wsaData;
     int   err;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
         
         hwnd = CreateWindow (szAppName,                  // window class name
                              TEXT ("The Hello Program"), // window caption
                              WS_OVERLAPPEDWINDOW,        // window style
                              500,       // initial x position
                              500,   // initial y position
                              200,   // initial x size
                              200,   // initial y size
                              NULL,                       // parent window handle
                              NULL,                       // window menu handle
                              hInstance,                  // program instance handle
                              NULL) ;                     // creation parameters
         
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;  //初始化套接字
     err= WSAStartup (MAKEWORD (2, 2), &wsaData);
    if(err!=0)
    {
    MessageBox (NULL,"初始化套阶字失败","err",0);
    return  FALSE;
    }
    //创建客户端套阶字
    clientSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(clientSocket==INVALID_SOCKET)
    {
    MessageBox(NULL,"创建套阶字失败","err",0);
    WSACleanup();
    return FALSE;
    }
    //调用WSAAsyncSelect()函数
    err = WSAAsyncSelect (clientSocket, hwnd, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE );
         
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         HDC         hdc ;
     TCHAR       Buffer[] = "HELLO";
     int         retval; 
     struct sockaddr_in  conAddr;
         
         switch (message)
         {
         case WM_SOCKET:
     if ( WSAGETSELECTERROR(lParam))
     {
     closesocket( wParam);
     break;
     }  switch(WSAGETSELECTEVENT (lParam))
     {
     case FD_CONNECT:
     // 请求连接
     conAddr.sin_family=AF_INET;
     conAddr.sin_port=htons(1000);
     conAddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.167");
                                 //这是我机器的IP
     connect ( clientSocket, ( struct sockaddr *) &conAddr,
     sizeof(conAddr));  break;  case FD_WRITE:
     //传送数据并打印出来
     retval = send ( clientSocket, Buffer,sizeof(Buffer),0);
     
     hdc = GetDC(hwnd);
     TextOut(hdc, 0, 0, TEXT(Buffer), strlen (Buffer ));
     ReleaseDC(hwnd, hdc );  break;  case FD_CLOSE:
     closesocket (wParam);
     break;
     }  return 0;          
         case WM_DESTROY:
      closesocket(clientSocket);
      WSACleanup();
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
      

  12.   

    这个是调试通过了的:
    client.c
    #include "WINSOCK.H"
    #include <stdio.h>
    #define DATA "half a league, half a league..."main (argc, argv)
    int argc;
    char *argv[];
    {
    int sock;
    struct sockaddr_in server;
    struct hostent *hp;//, *gethostbyname();
    char buf[1024]; WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 2, 2 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )  return 0; sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
    {
    perror("opening stream socket");
    exit(1);
    } server.sin_family = AF_INET;
    hp = gethostbyname(argv[1]);
    if (hp == 0)
    {
    fprintf(stderr, "%s: unknown host\n", argv[1]);
    exit(2);
    } memcpy((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length);
    server.sin_port = htons(atoi(argv[2])); if (connect( sock, (struct sockaddr*)&server, sizeof(server)) < 0)
    {
    perror("connectiong stream socket");
    exit(3);
    }
    if (send( sock, DATA, sizeof(DATA), 0) < 0)
    perror("sending on stream socket");
    closesocket(sock); WSACleanup();
    exit(0);
    }server.c//#include <afx.h>
    #include <winsock.h>
    //#include <windows.h>
    #include <stdio.h>
    #define TRUE 1main()
    {
    int sock, length;
    struct sockaddr_in server;
    //struct sockaddr tcpaddr;
    int msgsock;
    char buf[1024];
    int rval, len;
    int err1; WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD( 2, 2 );

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 )  return 0;
     
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0){
    perror(" opening stream socket ");
    exit(1);
    }
    //SockAddr.sin_family = AF_INET;
    //SockAddr.sin_addr.s_addr = INADDR_ANY;
    //SockAddr.sin_port   = ::htons(nPort);
    server.sin_family = AF_INET;
    server.sin_addr.S_un.S_addr = INADDR_ANY;
    server.sin_port = 4000; //server.sin_addr.S_un.S_addr = "192.168.111.77";
    if (bind (sock, (struct sockaddr*) &server, sizeof(server)) == SOCKET_ERROR){
    perror(" binding stream socket ");
    err1 = GetLastError();
    exit(1);
    } length = sizeof(server);
    if (getsockname(sock, (struct sockaddr*)&server, &length) == SOCKET_ERROR){
    perror(" getting socket name");
    err1 = GetLastError();
    exit(1);
    } printf("socket port # %d\n", ntohs(server.sin_port));
    listen(sock, 5);
    len = sizeof(struct sockaddr);
    do{
    msgsock = accept(sock, (struct sockaddr*) &server, (int*)&len);
    if (msgsock == -1)
    perror("accept");
    else do{
    memset(buf, 0, sizeof(buf));
    if ((rval = recv( msgsock, buf, 1024, 0)) < 0)
    perror("reading stream message");
    if (rval == 0)
    printf("ending connection\n");
    else
    printf("-->%s\n",buf);
    }while(rval != 0);
    closesocket(msgsock);
    }while(TRUE); WSACleanup();
    exit(0);
    }
      

  13.   

    服务端应该没错,但你在客户端就大错了
    connect ( clientSocket, ( struct sockaddr *) &conAddr,
                 sizeof(conAddr));
    函数怎么能在FD_CONNECT:下调用呢,应在WINMAIN()中才对,
    还有,retval = send ( clientSocket, Buffer,sizeof(Buffer),0);
    函数也不能在FD_WRITE:下调用FD_CONNECT消息是在你调用CONNECT()之后,得到服务器的ACCEPT()时才会
    产生的,也就是说FD_CONNECT仅用来检验是否连接上服务器SEND应由外部事件触发(如点击按钮),产生FD_WRITE仅意味着你可以发送消息
    :作为一个应用程序,自收到首条FD_WRITE消息开始,便可以发送数据,直到一个SEND返回WSAEWOULDBLOCK错误,经过这个失败后,要再另一条FD_WRITE通知应用程序才能再次发送数据
      

  14.   

    to lbird(蓝鸟) 
    你好,我真的很笨
    你能不能改一改我的代码,实现功能。
    最好是能过响应FD_CONNECT,FD_WRITE消息
    我对FD_WRITE还不是很理解
    万分感谢!