⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.c

📁 一个C语言编写的SOCKET程序。比较简单一点。
💻 C
字号:
/*
 * TCP Stream Socket Client
 * 这个例子说明了如何实现一个Winsock的客户端。
 * 它做的工作非常简单,负责发送一条消息到服务器,并且接收从服务器的返回信息。
 * 如果指定服务器名为"localhost",这个程序和TCP Stream Socket Server这个例子运行在同一台机器上。
 * 也可以通过指定其他服务器名来在不同的机器上工作。
*/
#include <windows.h> 
#include <winsock.h>

#define PORTNUM         5000          // 端口号
#define HOSTNAME        "localhost"   // 服务器名字
                                      // 根据服务器的不同,更改上面的名字
                                      
int WINAPI WinMain (
              HINSTANCE hInstance,    // 实例句柄
              HINSTANCE hPrevInstance,// NULL
              LPTSTR lpCmdLine,       // 用于运行程序的命令行
              int nCmdShow)           // 程序的最初的显示方式
{
  int index = 0,                      // 索引
      iReturn;                        // recv函数的返回值
  char szClientA[100];                // ASCII码串
  TCHAR szClientW[100];               // Unicode串
  TCHAR szError[100];                 // 出错消息串

  SOCKET ServerSock = INVALID_SOCKET; // 服务器的socket
  SOCKADDR_IN destination_sin;        // 服务器的socket地址
  PHOSTENT phostent = NULL;           // 指向服务器的HOSTENT结构
  WSADATA WSAData;                    // 包含了Winsocket执行后的细节

  // 初始化Winsocket. 
  if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) 
  {
    wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), 
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    return FALSE;
  }

  // 创建一个绑定服务器的TCP/IP socket
  if ((ServerSock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  {
    wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), 
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    return FALSE;
  }

  // 把服务器的socket的地址信息填入
  destination_sin.sin_family = AF_INET;

  // 通过主机名取得主机信息
  if ((phostent = gethostbyname (HOSTNAME)) == NULL) 
  {
    wsprintf (szError, TEXT("Unable to get the host name. Error: %d"), 
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    closesocket (ServerSock);
    return FALSE;
  }

  // 分配socket IP地址
  memcpy ((char FAR *)&(destination_sin.sin_addr), 
          phostent->h_addr, 
          phostent->h_length);

  // 转化端口字段为大终点
  destination_sin.sin_port = htons (PORTNUM);      

  // 建立一个到服务器socket的连接.
  if (connect (ServerSock, 
               (PSOCKADDR) &destination_sin, 
               sizeof (destination_sin)) == SOCKET_ERROR) 
  {
    wsprintf (szError, 
              TEXT("Connecting to the server failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    closesocket (ServerSock);
    return FALSE;
  }

  // 向服务器发送信息
  if (send (ServerSock, "To Server.", strlen ("To Server.") + 1, 0)
           == SOCKET_ERROR) 
  {
    wsprintf (szError, 
              TEXT("Sending data to the server failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
  }

  // 禁止服务器接收信息
  shutdown (ServerSock, 0x01);

  for (;;)
  {
    // 从服务器接收信息
    iReturn = recv (ServerSock, szClientA, sizeof (szClientA), 0);

    // 如果接收到服务器信息,显示之
    if (iReturn == SOCKET_ERROR)
    {
      wsprintf (szError, TEXT("No data is received, recv failed.")
                TEXT(" Error: %d"), WSAGetLastError ());
      MessageBox (NULL, szError, TEXT("Client"), MB_OK);
      break;
    }
    else if (iReturn == 0)
    {
      MessageBox (NULL, TEXT("Finished receiving data"), TEXT("Client"),
                  MB_OK);
      break;
    }
    else
    {
      // 把ASCII码字符串转换成Unicode码字符串
      for (index = 0; index <= sizeof (szClientA); index++)
        szClientW[index] = szClientA[index];

      // 显示从服务器接收到的字符串
      MessageBox (NULL, szClientW, TEXT("Received From Server"), MB_OK);
    }
  }

  // 禁止服务器发送信息
  shutdown (ServerSock, 0x00);

  // 关闭服务器socket.
  closesocket (ServerSock);

  WSACleanup ();

  return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -