编写两个windows程序,每个程序都既有客户端又有服务端,采用winsock模式相互通信。我知道实现这样的程序需要至少两个线程,即一个线程实现客户端功能,一个线程实现服务端功能。我是网络编程的菜鸟~~请问各位高手,能否给出编写的流程(有实例参考代码就最好了),谢谢~~

解决方案 »

  1.   

    自己到网上找相关的demo或者找本书看看吧.
      

  2.   

    你看看,行不行。
    #include <winsock.h>
    #include <stdio.h>#define PORT          5150
    #define MSGSIZE       1024#pragma comment(lib, "ws2_32.lib")int       g_iTotalConn = 0;
    SOCKET g_CliSocketArr[FD_SETSIZE];DWORD WINAPI WorkerThread(LPVOID lpParameter);int main()
    {
         WSADATA        wsaData;
         SOCKET         sListen, sClient;
         SOCKADDR_IN local, client;
         int            iaddrSize = sizeof(SOCKADDR_IN);
         DWORD          dwThreadId;
     
         // Initialize Windows socket library
         WSAStartup(0x0202, &wsaData);
     
         // Create listening socket
         sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     
         // Bind
         local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
     local.sin_family = AF_INET;
     local.sin_port = htons(PORT);
         bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));
     
         // Listen
         listen(sListen, 3);
     
         // Create worker thread
         CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);  
     
         while (TRUE)
         {
     // Accept a connection
     sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);
     printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
     
     // Add socket to g_CliSocketArr
     g_CliSocketArr[g_iTotalConn++] = sClient;
         }
     
         return 0;
    }DWORD WINAPI WorkerThread(LPVOID lpParam)
    {
    int               i;
    fd_set            fdread;
    int               ret;
    struct timeval tv = {1, 0};//秒,毫秒
    char              szMessage[MSGSIZE];
    memset(szMessage,0,MSGSIZE);

    while (TRUE)
    {
    FD_ZERO(&fdread);
    for (i = 0; i < g_iTotalConn; i++)
    {
    FD_SET(g_CliSocketArr[i], &fdread);
    }

    // We only care read event
    ret = select(0, &fdread, NULL, NULL, &tv);

    if (ret == 0) //Wait time out.
    {
    printf("time out\n");
    continue;
    }

    for (i = 0; i < g_iTotalConn; i++)
    {
    if (FD_ISSET(g_CliSocketArr[i], &fdread))
    {
    // A read event happened on g_CliSocketArr[i]
    ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);
    if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
    {
    // Client socket closed
    printf("Client socket %d closed.\n", g_CliSocketArr[i]);
    closesocket(g_CliSocketArr[i]);
    if (i < g_iTotalConn - 1)
    {            
    g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];
    }
    }
    else
    {
    // We received a message from client
    char* pMsg = new char[ret - 5];
    memcpy(pMsg,szMessage+5,ret - 5);
    printf("%s\n",pMsg);
    delete[] pMsg;
    send(g_CliSocketArr[i], szMessage, ret, 0);

    }
    }
    }
    }

    return 0;
    }
      

  3.   

    对了,发送的细节你改一下。
                        // We received a message from client
                        char* pMsg = new char[ret - 5];
                        memcpy(pMsg,szMessage+5,ret - 5);
                        printf("%s\n",pMsg);
                        delete[] pMsg;
                        send(g_CliSocketArr[i], szMessage, ret, 0);
    改为:send(g_CliSocketArr[i],szMessage.ret,0);
      

  4.   

    DWORD WINAPI WorkerThread(LPVOID lpParam)这个函数里的东西是不是就是实现了客户端的功能?
    我不明白的是,怎么没有看到connect()呢?