走在架構(gòu)師的大道上 Jack.Wang's home

          Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項目管理 Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

          公告

          重構(gòu)
          新浪博客:新浪 blog
          MSN: wbjeasygo@163.com
          Email:  wbjeasygo@163.com
          QQ 精英群: 47763528 
          空間QQ空間

          淘寶店:新開淘寶書店
          致謝:
           感謝雷老師幾年的指導(dǎo)
           感謝導(dǎo)師在學(xué)業(yè)上的關(guān)懷,
           感謝老婆的支持,
           感謝我的同學(xué)和同事,
           在我成長的路上有你

          留言簿(26)

          我參與的團隊

          隨筆分類(232)

          隨筆檔案(190)

          我的鄰居們

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

           

           SOCKET programming

           1client

           basic algorithm

           1)。Find the address of the server (IP+PORT);

           2)。Using SOCKET call to create the socket

           3)。Get the local port number using CONNECT call ;

           4)。Connect the client socket to the socket of the server ;CONNECT call

           5)。Communication using some calls (write /read )

           6)。Close the socket .

          2Server

          Basic algorithm

          (1)create the socket ;

          (2)Bind the socket to the address;

          (3)Listen on the address ;

          (4)Accept the client require ;

          (5)EXEC some program according the clients requirement .

           Example:

          // Module Name: Client.c

           // Description:

          //    This sample is the echo client. It connects to the TCP server,

          //    sends data, and reads data back from the server.

          // Compile:

          //    cl -o Client Client.c ws2_32.lib

          //// Command Line Options:

          //    client [-p:x] [-s:IP] [-n:x] [-o]

          //           -p:x      Remote port to send to

          //           -s:IP     Server's IP address or hostname

          //           -n:x      Number of times to send message

          //           -o        Send messages only; don't receive

           #include <winsock2.h>

          #include <stdio.h>

          #include <stdlib.h>

          #define DEFAULT_COUNT       20

          #define DEFAULT_PORT        5150

          #define DEFAULT_BUFFER      2048

          #define DEFAULT_MESSAGE     "This is a test of the emergency "

          broadcasting system"

          char szServer[128],          // Server to connect to

                szMessage[1024];        // Message to send to sever

          int   iPort     = DEFAULT_PORT; // Port on server to connect to

          DWORD dwCount   = DEFAULT_COUNT; // Number of times to send message

          BOOL bSendOnly = FALSE;         // Send data only; don't receive

          //

          // Function: usage:

          //

          // Description:

          //    Print usage information and exit

          //

          void usage()

          {

              printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]"n"n");

              printf("       -p:x      Remote port to send to"n");

              printf("       -s:IP     Server's IP address or hostname"n");

              printf("       -n:x      Number of times to send message"n");

              printf("       -o        Send messages only; don't receive"n");

              ExitProcess(1);

          }

          //

          // Function: ValidateArgs

          //

          // Description:

          //    Parse the command line arguments, and set some global flags

          //    to indicate what actions to perform

          //

          void ValidateArgs(int argc, char **argv)

          {

              int                i;

              for(i = 1; i < argc; i++)

              {

                  if ((argv[i][0] == '-') || (argv[i][0] == '/'))

                  {

                      switch (tolower(argv[i][1]))

                      {

                          case 'p':        // Remote port

                              if (strlen(argv[i]) > 3)

                                  iPort = atoi(&argv[i][3]);

                              break;

                          case 's':       // Server

                              if (strlen(argv[i]) > 3)

                                  strcpy(szServer, &argv[i][3]);

                              break;

                          case 'n':       // Number of times to send message

                              if (strlen(argv[i]) > 3)

                                  dwCount = atol(&argv[i][3]);

                              break;

                          case 'o':       // Only send message; don't receive

                              bSendOnly = TRUE;

                             break;

                          default:

                              usage();

                              break;

                      }

                  }

              }

          }

          //

          // Function: main

          //

          // Description:

          //    Main thread of execution. Initialize Winsock, parse the

          //    command line arguments, create a socket, connect to the

          //    server, and then send and receive data.

          //

          int main(int argc, char **argv)

          {

              WSADATA       wsd;

              SOCKET        sClient;

              char          szBuffer[DEFAULT_BUFFER];

              int           ret,

                            i;

              struct sockaddr_in server;

              struct hostent    *host = NULL;

              // Parse the command line and load Winsock

              //

              ValidateArgs(argc, argv);

              if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)

              {

                  printf("Failed to load Winsock library!"n");

                  return 1;

              }

              strcpy(szMessage, DEFAULT_MESSAGE);

              //

              // Create the socket, and attempt to connect to the server

              //

              sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

              if (sClient == INVALID_SOCKET)

              {

                  printf("socket() failed: %d"n", WSAGetLastError());

                  return 1;

              }

              server.sin_family = AF_INET;

              server.sin_port = htons(iPort);

              server.sin_addr.s_addr = inet_addr(szServer);

              //

              // If the supplied server address wasn't in the form

              // "aaa.bbb.ccc.ddd" it's a hostname, so try to resolve it

              //

              if (server.sin_addr.s_addr == INADDR_NONE)

              {

                  host = gethostbyname(szServer);

                  if (host == NULL)

                  {

                      printf("Unable to resolve server: %s"n", szServer);

                      return 1;

                  }

                  CopyMemory(&server.sin_addr, host->h_addr_list[0],

                      host->h_length);

              }

              if (connect(sClient, (struct sockaddr *)&server,

                  sizeof(server)) == SOCKET_ERROR)

              {

                  printf("connect() failed: %d"n", WSAGetLastError());

                  return 1;

              }

              // Send and receive data

              //

              for(i = 0; i < dwCount; i++)

              {

                  ret = send(sClient, szMessage, strlen(szMessage), 0);

                  if (ret == 0)

                      break;

                  else if (ret == SOCKET_ERROR)

                  {

                      printf("send() failed: %d"n", WSAGetLastError());

                      break;

                  }

                  printf("Send %d bytes"n", ret);

                  if (!bSendOnly)

                  {

                      ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);

                      if (ret == 0)        // Graceful close

                          break;

                      else if (ret == SOCKET_ERROR)

                      {

                          printf("recv() failed: %d"n", WSAGetLastError());

                          break;

                      }

                      szBuffer[ret] = '"0';

                      printf("RECV [%d bytes]: '%s'"n", ret, szBuffer);

                     }

              }

              closesocket(sClient);

              WSACleanup();

              return 0;

          }

           

           

           

          // Module Name: Server.c

          // Description:

          //    This example illustrates a simple TCP server that accepts

          //    incoming client connections. Once a client connection is

          //    established, a thread is spawned to read data from the

          //    client and echo it back (if the echo option is not

          //    disabled).

          //

          // Compile:

          //    cl -o Server Server.c ws2_32.lib

          //

          // Command line options:

          //    server [-p:x] [-i:IP] [-o]

          //           -p:x      Port number to listen on

          //           -i:str    Interface to listen on

          //           -o        Receive only, don't echo the data back

          //

          #include <winsock2.h>

          #include <stdio.h>

          #include <stdlib.h>

          #define DEFAULT_PORT        5150

          #define DEFAULT_BUFFER      4096

          int    iPort      = DEFAULT_PORT; // Port to listen for clients on

          BOOL   bInterface = FALSE, // Listen on the specified interface

                 bRecvOnly = FALSE;   // Receive data only; don't echo back

          char   szAddress[128];       // Interface to listen for clients on

          //

          // Function: usage

          //

          // Description:

          //    Print usage information and exit

          //

          void usage()

          {

              printf("usage: server [-p:x] [-i:IP] [-o]"n"n");

              printf("       -p:x      Port number to listen on"n");

              printf("       -i:str    Interface to listen on"n");

              printf("       -o        Don't echo the data back"n"n");

              ExitProcess(1);

          }

          //

          // Function: ValidateArgs

          //

          // Description:

          //    Parse the command line arguments, and set some global flags

          //    to indicate what actions to perform

          //

          void ValidateArgs(int argc, char **argv)

          {

              int i;

              for(i = 1; i < argc; i++)

              {

                  if ((argv[i][0] == '-') || (argv[i][0] == '/'))

                  {

                      switch (tolower(argv[i][1]))

                      {

                          case 'p':

                              iPort = atoi(&argv[i][3]);

                              break;

                          case 'i':

                              bInterface = TRUE;

                              if (strlen(argv[i]) > 3)

                                  strcpy(szAddress, &argv[i][3]);

                              break;

                             case 'o':

                             bRecvOnly = TRUE;

                                 break;

                          default:

                              usage();

                              break;

                      }

                  }

              }

          }

          //

          // Function: ClientThread

          //

          // Description:

          //    This function is called as a thread, and it handles a given

          //    client connection. The parameter passed in is the socket

          //    handle returned from an accept() call. This function reads

          //    data from the client and writes it back.

          //

          DWORD WINAPI ClientThread(LPVOID lpParam)

          {

              SOCKET        sock=(SOCKET)lpParam;

              char          szBuff[DEFAULT_BUFFER];

              int           ret,

                            nLeft,

                            idx;

              while(1)

              {

                  // Perform a blocking recv() call

                  //

                  ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);

                  if (ret == 0)        // Graceful close

                      break;

                  else if (ret == SOCKET_ERROR)

                  {

                      printf("recv() failed: %d"n", WSAGetLastError());

                      break;

                  }

                  szBuff[ret] = '"0';

                  printf("RECV: '%s'"n", szBuff);

                  //

                  // If we selected to echo the data back, do it

                  //

                  if (!bRecvOnly)

                  {

                      nLeft = ret;

                      idx = 0;

                      //

                      // Make sure we write all the data

                      //

                      while(nLeft > 0)

                      {

                          ret = send(sock, &szBuff[idx], nLeft, 0);

                          if (ret == 0)

                              break;

                          else if (ret == SOCKET_ERROR)

                          {

                              printf("send() failed: %d"n",

                                  WSAGetLastError());

                              break;

                          }

                          nLeft -= ret;

                          idx += ret;

                         }

                  }

              }

              return 0;

          }

          //

          // Function: main

          //

          // Description:

          //    Main thread of execution. Initialize Winsock, parse the

          //    command line arguments, create the listening socket, bind

          //    to the local address, and wait for client connections.

          //

          int main(int argc, char **argv)

          {

              WSADATA       wsd;

              SOCKET        sListen,

                            sClient;

              int           iAddrSize;

              HANDLE        hThread;

              DWORD         dwThreadId;

              struct sockaddr_in local,

                                 client;

              ValidateArgs(argc, argv);

              if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)

              {

                  printf("Failed to load Winsock!"n");

                  return 1;

              }

              // Create our listening socket

              //

              sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

              if (sListen == SOCKET_ERROR)

              {

                  printf("socket() failed: %d"n", WSAGetLastError());

                  return 1;

              }

              // Select the local interface and bind to it

              //

              if (bInterface)

              {

                  local.sin_addr.s_addr = inet_addr(szAddress);

                  if (local.sin_addr.s_addr == INADDR_NONE)

                      usage();

              }

              else

                  local.sin_addr.s_addr = htonl(INADDR_ANY);

              local.sin_family = AF_INET;

              local.sin_port = htons(iPort);

              if (bind(sListen, (struct sockaddr *)&local,

                      sizeof(local)) == SOCKET_ERROR)

              {

                  printf("bind() failed: %d"n", WSAGetLastError());

                  return 1;

              }

              listen(sListen, 8);

              //

              // In a continous loop, wait for incoming clients. Once one

              // is detected, create a thread and pass the handle off to it.

              //

              while (1)

              {

                  iAddrSize = sizeof(client);

                  sClient = accept(sListen, (struct sockaddr *)&client,

                                  &iAddrSize);       

                  if (sClient == INVALID_SOCKET)

                  {       

                      printf("accept() failed: %d"n", WSAGetLastError());

                      break;

                  }

                  printf("Accepted client: %s:%d"n",

                      inet_ntoa(client.sin_addr), ntohs(client.sin_port));

                  hThread = CreateThread(NULL, 0, ClientThread,

                              (LPVOID)sClient, 0, &dwThreadId);

                  if (hThread == NULL)

                  {

                      printf("CreateThread() failed: %d"n", GetLastError());

                      break;

                  }

                  CloseHandle(hThread);

              }

              closesocket(sListen);

              WSACleanup();

              return 0;

          }

           





          本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進步。
          posted on 2007-10-14 16:51 Jack.Wang 閱讀(1642) 評論(0)  編輯  收藏 所屬分類: 開發(fā)技術(shù)
          主站蜘蛛池模板: 油尖旺区| 铜山县| 贵州省| 台山市| 阿图什市| 黑河市| 贵南县| 嘉义县| 广水市| 林西县| 峨眉山市| 黑河市| 河池市| 乌拉特后旗| 定日县| 葫芦岛市| 平塘县| 尼勒克县| 河北省| 喀喇沁旗| 永川市| 陆川县| 丹巴县| 乡城县| 昂仁县| 娄底市| 上饶市| 孟村| 靖州| 竹山县| 章丘市| 和硕县| 云龙县| 漳平市| 邢台市| 富顺县| 台安县| 文山县| 广西| 稷山县| 宁国市|