C++ socket实现miniFTP

本文实例为大家分享了C++ socket实现miniFTP的方法,供大家参考,具体内容如下

客户端:

服务端:

建立连接

连接使用 TCP 连接,服务器和客户端分别创建自己的套接字一端,服务器等待连接,客户端发起连接(并指定服务器 ip)。在两者端口号一致且不被占用的情况下,连接建立。
        在整个过程中,服务器对每一个来访的客户端建立一个连接,在客户未请求与服务器断开时,该连接一直存在,用户可以不断向服务器发出请求。(持久性、流水线型连接 )
        客户端断开后,关闭客户端的套接字部分,服务器继续等待新的连接。服务器一次只能处理一个客户端的连接,不支持并发访问。

PDU 格式

由于 ftp 应当支持几乎任意类型文件,而几乎所有类型文件都能用二进制来解析,所以我们采用了二进制的格式来读取以及写入文件。在整个过程中,我们并不关心文件的具体内容,也无需在程序中解析文件,而是将其当作数据流看待。
        受到缓存区大小的限制,我们无法一次性传输整个文件,所以我们将文件按缓存区大小拆分成数据包分批发送,我们可以将数据及时从缓存区写入文件,这样就让出了缓存区空间。数据包仅仅包含数据,不包含头部或尾部信息。
        此外,接收文件时,recv()函数将会循环调用,因此,我们需要一个信号来通知什么时候发送完毕。
        一个想法是发送终止信号,这是可行的,但更好的方法是在一开始发送文件总字节数,让接收方根据剩余字节大小判断什么时候接收完毕。因为在写入文件时,我们需要指定写入的字节数,尤其是在发来的数据流字节数不等于缓冲区大小时。写入字节数的错误会导致文件受损。

接收确认

我们知道 TCP 是可靠传输协议,它采取了一系列措施来保证传输不会出错。所以在使用 TCP 连接时,我们相信数据在链路层上没有出差错,它一定会成功发送到对方手上。但是在客户端接收服务器发来的文件的时候,我们仍然需要服务器发来确认信息。原因在于,虽然我们可以保证链路层不出错,但是我们无法保证应用层不出错。例如,客户端可能会给出错误的文件名,因为接收不到服务器发来的信息,所以会陷入空等状态。

ftpClient.h

#pragma
#include<winsock.h>
class ftpClient
{
private:
  enum {
    SERVER_PORT = 9999,
    BUFFER_SIZE = 4096
  };
  sockaddr_in serverChannel;
  char buffer[BUFFER_SIZE];
  int serverSocket;
  int clientSocket;
  bool isConnect;
  char name[50]; 

  bool getFile();
  bool putFile();
  bool acknowledge();
  bool sendRequest(char* instruction);
  bool connect2Host(const char* hostName);
  bool getWorkDir(); 

public:
  ftpClient();
  ~ftpClient();
  void start();
};

ftpClient.cpp

#define _CRT_SECURE_NO_WARNINGS
#include"ftpClient.h"
#include<cstdio>
#include<io.h>
#include<cstring>
#include<fstream> 

ftpClient::ftpClient()
{
  WORD wVersionRequested;
  WSADATA wsaData;
  int ret; 

  //WinSock初始化:
  wVersionRequested = MAKEWORD(2, 2);//希望使用的WinSock DLL的版本
  ret = WSAStartup(wVersionRequested, &wsaData);
  if (ret != 0)
  {
    printf("WSAStartup() failed!\n");
  }
  //确认WinSock DLL支持版本2.2:
  if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
  {
    WSACleanup();
    printf("Invalid Winsock version!\n");
  }
  isConnect = false;
} 

void ftpClient::start()
{
  char c[100];
  char d[100];
  printf("这里是FTP客户端,您可以输入help查看操作方法,输入quit退出客户端\n"); 

  while (1) {
    scanf("%s", c);
    if (strcmp(c, "help") == 0) {
      printf("get [fileName]  --  下载文件\n"
        "put [fileName]  --  上传文件\n"
        "ftp [ip]     --  登录FTP\n"
        "pwd        --  显示服务器当前工作文件夹\n"
        "cd [dirName]   --  更改当前文件夹\n"
        "close       --  关闭与当前ftp的连接\n"
        "quit       --  退出客户端\n"
        );
    }
    else if (strcmp(c, "get") == 0) {
      scanf("%s", d);
      strcat(c, " ");
      strcat(c, d);
      if (!isConnect) {
        printf("you haven't connected to any server!\n");
      }
      else sendRequest(c);
    }
    else if (strcmp(c, "put") == 0) {
      scanf("%s", d);
      strcat(c, " ");
      strcat(c, d);
      if (!isConnect) {
        printf("you haven't connected to any server!\n");
      }
      else sendRequest(c);
    }
    else if (strcmp(c, "ftp") == 0) {
      scanf("%s", d);
      if (!isConnect&&connect2Host(d)) {
        isConnect = true;
      }
      else if(isConnect){
        printf("you have already connected to server\n"
          "please close the connection before connect to a new server\n");
      }
    }
    else if (strcmp(c, "pwd") == 0) {
      if (!isConnect) {
        printf("you haven't connected to any server!\n");
      }
      else sendRequest(c);
    }
    else if (strcmp(c, "cd") == 0) {
      scanf("%s", d);
      strcat(c, " ");
      strcat(c, d);
      if (!isConnect) {
        printf("you haven't connected to any server!\n");
      }
      else sendRequest(c);
    }
    else if (strcmp(c, "quit") == 0) {
      if (isConnect) {
        strcpy(c, "close");
        isConnect = false;
        send(clientSocket, c, strlen(c) + 1, 0);
        closesocket(clientSocket);
      }
      break;
    }
    else if (strcmp(c, "close") == 0) {
      if (isConnect) {
        isConnect = false;
        send(clientSocket, c, strlen(c) + 1, 0);
        closesocket(clientSocket);
      }
    }
    else {
      printf("syntex error\n");
    }
  }
} 

bool ftpClient::connect2Host(const char* hostName)
{
  //创建socket
  clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

  if (clientSocket < 0) {
    printf("cannot create socket\n");
    return false;
  }
  else printf("successfully create socket\n");
  memset(&serverChannel, 0, sizeof(serverChannel));//初始化为0 

  serverChannel.sin_family = AF_INET;//channel协议家族AF_INET
  serverChannel.sin_addr.S_un.S_addr = inet_addr(hostName);//地址
  serverChannel.sin_port = htons(SERVER_PORT);//服务器端口 

                        //建立连接
  serverSocket = connect(clientSocket, (sockaddr*)&serverChannel, sizeof(serverChannel)); 

  if (serverSocket < 0) {
    printf("cannot connect to the host\n");
    return false;
  }
  else {
    printf("successfully connect to the host\n");
    return true;
  }
} 

bool ftpClient::sendRequest(char* instruction)
{
  int r = send(clientSocket, instruction, strlen(instruction) + 1, 0);
  if (r == SOCKET_ERROR) {
    printf("request failed\n");
    return false;
  }
  else {
    printf("request success\n");
    char opt[5];
    int i = 0, j = 0;
    while (instruction[i] != ' '&&instruction[i] != '\0') {
      opt[i] = instruction[i];
      i++;
    }
    opt[i] = '\0';
    i++;
    while (instruction[i] != '\0') {
      name[j] = instruction[i];
      i++, j++;
    }
    name[j] = '\0';
    if (strcmp(opt, "get") == 0) {
      if (getFile()) {
        printf("successfully download\n");
      }
      else printf("download failed\n");
    }
    else if (strcmp(opt, "put") == 0) {
      if (putFile()) {
        printf("successfully upload\n");
      }
      else printf("upload failed\n");
    }
    else if (strcmp(opt, "pwd") == 0) {
      if (!getWorkDir())
        printf("get work directory failed\n");
    }
    else if (strcmp(opt, "cd") == 0) {
      printf("operation finished\n");
    }
    else {
      printf("syntex error\n");
      return false;
    }
    return true;
  }
} 

bool ftpClient::getFile()
{
  memset(buffer, 0, sizeof(buffer));
  int ret;
  char length[20];
  ret = recv(clientSocket, length, sizeof(length), 0);
  if (ret == SOCKET_ERROR) {
    return false;
  }
  else if (strcmp(length, "NAK") == 0) {
    return false;
  }
  int size = atoi(length);
  std::ofstream out; 

  out.open(name, std::ios::binary);
  if (!out) {
    printf("cannot save the file\n");
    return false;
  }
  while (size>0) {
    ret = recv(clientSocket, buffer, BUFFER_SIZE, 0);
    int s = size < BUFFER_SIZE ? size : BUFFER_SIZE;
    if (ret == SOCKET_ERROR) {
      out.close();
      return false;
    }
    else if (strcmp(buffer, "NAK") == 0) {
      out.close();
      return false;
    }
    else {
      out.write(buffer, s);
    }
    size -= BUFFER_SIZE;
  }
  out.close();
  return acknowledge();
} 

bool ftpClient::putFile()
{
  std::ifstream in;
  //打开文件
  in.open(name, std::ios::binary);
  if (!in) {
    printf("cannot open the file\n");
    return false;
  }
  memset(buffer, 0, sizeof(buffer));
  //得到文件的字节数
  in.seekg(0, std::ios_base::end);
  int sp = in.tellg();
  int total_size = 0;
  int r;
  char length[20];
  sprintf(length, "%d", sp); 

  //发送字节
  r = send(clientSocket, length, sizeof(length), 0);
  if (r == SOCKET_ERROR) {
    return false;
  }
  while (sp > 0) {
    in.clear();
    in.seekg(total_size, std::ios_base::beg);
    memset(buffer, 0, sizeof(buffer));
    //读取文件
    in.read(buffer, sizeof(buffer));
    int size = sp < BUFFER_SIZE ? sp : BUFFER_SIZE;
    total_size += size;
    //发送文件
    r = send(clientSocket, buffer, size, 0); 

    sp -= size;
    if (r == SOCKET_ERROR) {
      in.close();
      return false;
    }
  }
  in.close();
} 

bool ftpClient::getWorkDir() {
  printf("getWorkDir\n");
  memset(buffer, 0, sizeof(buffer));
  int ret;
  char length[20];
  ret = recv(clientSocket, length, sizeof(length), 0);
  if (ret == SOCKET_ERROR) {
    return false;
  }
  int size = atoi(length);
  while (size>0) {
    ret = recv(clientSocket, buffer, BUFFER_SIZE, 0);
    if (ret == SOCKET_ERROR) {
      return false;
    }
    else {
      printf("%s", buffer);
    }
    size -= BUFFER_SIZE;
  }
  return true;
} 

bool ftpClient::acknowledge()
{
  int ret = recv(clientSocket, buffer, BUFFER_SIZE, 0);
  if (ret > 0) {
    if (strcmp(buffer, "NAK") == 0)return false;
    else if (strcmp(buffer, "ACK") == 0)return true;
  }
} 

ftpClient::~ftpClient()
{
  if (isConnect) {
    isConnect = false;
    char c[6];
    strcpy(c, "close");
    send(clientSocket, c, strlen(c) + 1, 0);
    closesocket(clientSocket);
  }
}

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma(lib,"ws2_32.lib")
#include"ftpClient.h"
#include<stdio.h> 

int main()
{
  ftpClient a;
  a.start();
  return 0;
}

ftpServer.h

#pragma once
#include<winsock.h> 

class ftpServer
{
private:
  enum {
    SERVER_PORT = 9999,
    BUFFER_SIZE = 4096,
    QUEUE_SIZE = 10
  };
  char buffer[BUFFER_SIZE];
  sockaddr_in serverChannel;
  char name[50];
  char workDir[100]; //store like C:\Users MARK:字符串末没有斜线!!
  int serverSocket; //socket
  int clientSocket;
  bool sendFile();
  bool receiveFile();
  bool doPwd();
  bool doCd();
  bool isValidPath(char* path);
public:
  ftpServer();
  bool start();//开启服务器
}; 

ftpServer.cpp
#define _CRT_SECURE_NO_WARNINGS 

#include"ftpServer.h"
#include<cstdio>
#include<cstdlib>
#include<fstream>
#include<cstring> 

ftpServer::ftpServer()
{
  WORD wVersionRequested;
  WSADATA wsaData;
  int ret; 

  //WinSock初始化:
  wVersionRequested = MAKEWORD(2, 2);//希望使用的WinSock DLL的版本
  ret = WSAStartup(wVersionRequested, &wsaData);
  if (ret != 0)
  {
    printf("WSAStartup() failed!\n");
  }
  //确认WinSock DLL支持版本2.2:
  if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
  {
    WSACleanup();
    printf("Invalid Winsock version!\n");
  }
  //workDir初始化为当前路径
  system("cd > tempFile");
  std::ifstream in("tempFile", std::ifstream::in);
  in >> workDir;
  in.close();
} 

bool ftpServer::start()
{
  int on = 1; 

  //初始化服务器
  memset(&serverChannel, 0, sizeof(serverChannel));
  serverChannel.sin_family = AF_INET;
  serverChannel.sin_addr.s_addr = htonl(INADDR_ANY);
  serverChannel.sin_port = htons(SERVER_PORT); 

  //创建套接字
  this->serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (serverSocket < 0) {
    printf("cannot create socket\n");
    return false;
  }
  else printf("successfully create socket\n");
  setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR,
    (char*)&on, sizeof(on)); 

  //绑定
  int b = bind(serverSocket, (sockaddr*)&serverChannel,
    sizeof(serverChannel));
  if (b < 0) {
    printf("bind error\n");
    return false;
  }
  else printf("successfully bind\n");
  //监听
  int l = listen(serverSocket, QUEUE_SIZE);
  if (l < 0) {
    printf("listen failed\n");
    return false;
  }
  else printf("successfully listen\n");
  int len = sizeof(serverChannel);
  //服务器等待连接
  while (1) {
    printf("waiting for connection...\n");
    //接受一个连接
    clientSocket = accept(serverSocket, (sockaddr*)&serverChannel,
      &len);
    if (clientSocket < 0) {
      printf("accept failed\n");
    }
    else {
      printf("successfully connect\n");
      while (1) {
        memset(buffer, 0, sizeof(buffer));
        int ret; 

        ret = recv(clientSocket, buffer, BUFFER_SIZE, 0); 

        if (ret == SOCKET_ERROR) {
          printf("receive failed\n");
        }
        else {
          char opt[50];
          printf("successfully receive\n");
          int i = 0, j = 0;
          printf("buffer = %s\n", buffer);
          while (buffer[i] != ' '&&buffer[i] != '\0') {
            opt[i] = buffer[i];
            i++;
          }
          opt[i] = '\0';
          if (buffer[i] != '\0') {
            i++;
          }
          while (buffer[i] != '\0') {
            name[j] = buffer[i];
            i++, j++;
          }
          name[j] = '\0'; 

          if (strcmp(opt, "get") == 0) {
            char ret[4];
            if (!sendFile()) {
              strcpy(ret, "NAK");
              send(clientSocket, ret, sizeof(ret), 0);
            }
            else {
              strcpy(ret, "ACK");
              send(clientSocket, ret, sizeof(ret), 0);
            }
          }
          else if (strcmp(opt, "put") == 0) {
            receiveFile();
          }
          else if (strcmp(opt, "pwd") == 0) {
            doPwd();
          }
          else if (strcmp(opt, "cd") == 0) {
            doCd();
          }
          else if (strcmp(opt, "close") == 0) {
            break;
          }
          else {
            printf("syntex error\n");
          }
        }
      }
    }
  }
  return true;
} 

bool ftpServer::sendFile()
{
  std::ifstream in;
  char path[100];
  strcpy(path, workDir);
  strcat(path, "\\");
  strcat(path, name); 

  in.open(path, std::ios::binary);
  if (!in) {
    printf("cannot open the file\n");
    return false;
  }
  memset(buffer, 0, sizeof(buffer));
  in.seekg(0, std::ios_base::end);
  int sp = in.tellg();
  int total_size = 0;
  int r;
  char length[20];
  sprintf(length, "%d", sp); 

  r = send(clientSocket, length, sizeof(length), 0); 

  if (r == SOCKET_ERROR) {
    printf("send failed\n");
    return false;
  }
  else {
    printf("send success\n");
  } 

  while (sp > 0) {
    in.clear();
    in.seekg(total_size, std::ios_base::beg);
    memset(buffer, 0, sizeof(buffer));
    in.read(buffer, sizeof(buffer));
    int size = sp < BUFFER_SIZE ? sp : BUFFER_SIZE;
    total_size += size;
    r = send(clientSocket, buffer, size, 0); 

    sp -= size;
    if (r == SOCKET_ERROR) {
      printf("send failed\n");
      return false;
    }
    else {
      printf("send success\n");
    }
  }
  in.close();
  return true;
} 

bool ftpServer::receiveFile()
{
  char path[100];
  strcpy(path, workDir);
  strcat(path, "\\");
  strcat(path, name);
  memset(buffer, 0, sizeof(buffer));
  int ret;
  char length[20];
  ret = recv(clientSocket, length, sizeof(length), 0);
  if (ret == SOCKET_ERROR) {
    printf("receive failed\n");
    return false;
  }
  else {
    printf("successfully receive\n");
  }
  int size = atoi(length);
  std::ofstream out; 

  out.open(path, std::ios::binary);
  if (!out) {
    printf("cannot save the file\n");
    return false;
  }
  while (size>0) {
    int s = size < BUFFER_SIZE ? size : BUFFER_SIZE;
    ret = recv(clientSocket, buffer, BUFFER_SIZE, 0);
    if (ret == SOCKET_ERROR) {
      printf("receive failed\n");
      break;
    }
    else {
      printf("successfully receive\n");
      out.write(buffer, s);
    }
    size -= BUFFER_SIZE;
  }
  out.close();
  return true;
} 

bool ftpServer::doPwd() {
  char temCMD[150];
  memset(temCMD, 0, sizeof(temCMD));
  strcat(temCMD, "echo ");
  strcat(temCMD, workDir);
  strcat(temCMD, " > tempFile");
  system(temCMD);
  memset(temCMD, 0, sizeof(temCMD));
  strcat(temCMD, "dir /b ");
  strcat(temCMD, workDir);
  strcat(temCMD, " >> tempFile");
  system(temCMD); 

  std::ifstream in("tempFile", std::fstream::in);
  if (!in) {
    printf("cannot open the file\n");
    return false;
  }
  memset(buffer, 0, sizeof(buffer));
  in.seekg(0, std::ios_base::end);
  int sp = in.tellg();
  int total_size = 0;
  int r;
  char length[20];
  sprintf(length, "%d", sp);
  r = send(clientSocket, length, sizeof(length), 0); 

  if (r == SOCKET_ERROR) {
    printf("send failed\n");
    return false;
  }
  else {
    printf("send success\n");
  }
  while (sp > 0) {
    in.clear();
    in.seekg(total_size, std::ios_base::beg);
    memset(buffer, 0, sizeof(buffer));
    in.read(buffer, sizeof(buffer));
    int size = sp < BUFFER_SIZE ? sp : BUFFER_SIZE;
    total_size += size;
    printf("transfer size = %d\n", total_size);
    r = send(clientSocket, buffer, size, 0); 

    sp -= size;
    if (r == SOCKET_ERROR) {
      printf("send failed\n");
      return false;
    }
    else {
      printf("send success\n");
    }
  }
  in.close();
  return true;
} 

bool ftpServer::isValidPath(char* path) {
  char temCMD[100];
  memset(temCMD, 0, sizeof(temCMD));
  strcat(temCMD, "cd ");
  strcat(temCMD, path);
  int res = system(temCMD);
  return res == 0;
} 

bool ftpServer::doCd() {
  for (int i = 0; name[i] != '\0'; ++i) {
    if (name[i] == '/')
      name[i] = '\\';
  }
  if (name[0] == '.'&&name[1] == '.') {
    char temDir[100];
    strcpy(temDir, workDir);
    for (int i = sizeof(temDir); i >= 0; --i) {
      if (temDir[i] == '\\') {
        temDir[i] = '\0';
        break;
      }
    }
    strcat(temDir, name + 2);
    if (isValidPath(temDir)) {
      strcpy(workDir, temDir);
    }
    else {
      return false;
    }
  }
  else if (name[0] == '.'&&name[1] != '.') {
    char temDir[100];
    strcpy(temDir, workDir);
    strcat(temDir, name + 1);
    if (isValidPath(temDir)) {
      strcpy(workDir, temDir);
    }
    else {
      return false;
    }
  }
  else if (name[1] == ':') {
    if (isValidPath(name)) {
      strcpy(workDir, name);
    }
    else {
      return false;
    }
  }
  else {
    char temDir[100];
    strcpy(temDir, workDir);
    strcat(temDir, "\\");
    strcat(temDir, name);
    if (isValidPath(temDir)) {
      strcpy(workDir, temDir);
    }
    else {
      return false;
    }
  }
  return true;
}

main.cpp

#include"ftpServer.h"
#pragma(lib,"ws2_32.lib")
int main()
{
 ftpServer f;
 f.start();
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++中Socket网络编程实例详解

    C++中Socket网络编程实例详解 现在几乎所有C/C++的后台程序都需要进行网络通讯,其实现方法无非有两种:使用系统底层socket或者使用已有的封装好的网络库.本文对两种方式进行总结,并介绍一个轻量级的网络通讯库ZeroMQ.  1.基本的Scoket编程 关于基本的scoket编程网络上已有很多资料,作者在这里引用一篇文章中的内容进行简要说明. 基于socket编程,基本上就是以下6个步骤: 1.socket()函数 2.bind()函数 3.listen().connect()函数 4

  • C语言实现socket简单通信实例

    本文实例讲述了C语言实现socket简单通信的方法,分享给大家供大家参考.具体实现方法如下: 服务器端代码如下: /* ============================================================================ Name : server.c Author : king Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-st

  • 浅谈C++ Socket编程

    sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的socket编程是采用的流式套接字. 服务器端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket()): 2:绑定套接字到一个IP地址和一个端口上(bind()): 3:将套接字设置为监听模式等待连接请求(listen()): 4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept())

  • vc++实现的tcp socket客户端和服务端示例

    Tcp Server 复制代码 代码如下: #include <WinSock2.h>#include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main(){ // initial socket library WORD wVerisonRequested; WSADATA wsaData; int err; wVerisonRequested = MAKEWORD(1, 1); err = WSASta

  • C++自定义封装socket操作业务类完整实例

    本文实例讲述了C++自定义封装socket操作业务类.分享给大家供大家参考,具体如下: Linux下C++封装socket操作的工具类(自己实现) socketconnector.h #ifndef SOCKETCONNECTOR_H #define SOCKETCONNECTOR_H #include "global.h" using namespace std; class SocketConnector { public: typedef enum { ENormal, EOth

  • 用C语言进行最基本的socket编程

    什么是socket 你经常听到人们谈论着 "socket",或许你还不知道它的确切含义.现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式.什么?你也许听到一些Unix高手(hacker)这样说过:"呀,Unix中的一切就是文件!"那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,程序是在读或者写一个文件描述符.一个文件描述符只是一个和打开的文件相关联的整数.但是(注意后面的话),

  • Android 模拟器(JAVA)与C++ socket 通讯 分享

    C++ 作为Client端view plaincopy to clipboardprint? 复制代码 代码如下: // Client.cpp : Defines the entry point for the console application.     //     #include "stdafx.h"     #include      #pragma comment(lib,"ws2_32.lib")     #define  MAX_BUF_SIZE

  • C++ 中 socket编程实例详解

    C++ 中 socket编程实例详解 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的socket编程是采用的流式套接字.在这个程序中,将两个工程添加到一个工作区.要链接一个ws2_32.lib的库文件. 服务器端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket()): 2:绑定套接字到一个IP地址和一个端口上(bind()): 3:将套接字设置为监听模式

  • C++ socket实现miniFTP

    本文实例为大家分享了C++ socket实现miniFTP的方法,供大家参考,具体内容如下 客户端: 服务端: 建立连接 连接使用 TCP 连接,服务器和客户端分别创建自己的套接字一端,服务器等待连接,客户端发起连接(并指定服务器 ip).在两者端口号一致且不被占用的情况下,连接建立.         在整个过程中,服务器对每一个来访的客户端建立一个连接,在客户未请求与服务器断开时,该连接一直存在,用户可以不断向服务器发出请求.(持久性.流水线型连接 )         客户端断开后,关闭客户端

  • Erlang中的socket编程简单例子

    Erlang 中gen_tcp 用于编写TCP程序,gen_udp用于编写UDP程序.一个简单的TCP服务器echo示例: 复制代码 代码如下: Start_echo_server()->          {ok,Listen}= gen_tcp:listen(1234,[binary,{packet,4},{reuseaddr,true},{active,true}]),          {ok,socket}=get_tcp:accept(Listen),          gen_tc

  • vue+socket.io+express+mongodb 实现简易多房间在线群聊示例

    项目简介 主要是通过做一个多人在线多房间群聊的小项目.来练手全栈技术的结合运用. 项目源码:chat-vue-node 主要技术: vue2全家桶 + socket.io + node(express) + mongodb(mongoose) 环境配置: 需安装配置好 node,mongodb环境(参考:http://www.jb51.net/article/109449.htm); 建议安装 Robomogo 客户端来管理mongodb数据. 编译运行: 1.开启MongoDB服务,新建命令行

  • .Net Core使用Socket与树莓派进行通信详解

    前言 去年买的树莓派一直放在抽屉里吃灰,前些阵子Debian 9发布,也不出意外的支持了树莓派. 于是重新拿出读卡器又重新了装上了Debian桌面版系统. 介绍 现在这个东西目前的程度只是了解一下Python和.Net的通信.最佳的版本应该是,可以通过服务器端远程执行树莓派命令. 这样做的原因大家也都知道,很多宽带现在不提供外网IP,这样造成家庭没有公网ip,也没办法远程对树莓派控制,我想做的东西类似内网穿透Ngrok之类的. 效果 Python端 #!/usr/bin/env python2

  • PHP socket 模拟POST 请求实例代码

    我们用到最多的模拟POST请求几乎都是使用php curl来实现了,没考虑到PHP socket也可以实现,今天看到朋友写了一文章,下面我来给大家分享一下PHP socket模拟POST请求实例. 以前模拟post请求俺都用PHP curl扩展实现来着,没想过PHP socket也可以实现.最近翻了下相关资料才发现原来没有那么高深,只是以前一直没有完全理解post的原理和本质而已,其实就是发送给目的程序一个标志为post的协议串如下: POST /目的程序url HTTP/1.1 Accept:

  • php简单socket服务器客户端代码实例

    本篇文章分享一个简单的socket示例,用php.实现一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务. 产生一个 socket 服务端 <?php /*文件名:socket_server.php*/ // 设置一些基本的变量 $host="127.0.0.1";//Socket运行的服务器的IP地址 $port=1234;//Socket运行的服务器的端口,端口取值为1到65535之间的数字,前提是这个端口未被使用 // 设置超时时间,这里设置为永不超时,确保PHP

  • 结合Python的SimpleHTTPServer源码来解析socket通信

    何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为I/O(input output). Unix的计算机处理IO是通过文件的抽象.计算机不同的进程之间也有输入输出,也就是通信.因此这这个通信也是通过文件的抽象文件描述符来进行. 在同一台计算机,进程之间可以这样通信,如果是不同的计算机呢?网络上不同的计算机,也可以通信,那么就得使用网络套接字(socket).socket就是在不同计算机之间进行通信的一个抽象.他工作于T

  • Python Socket传输文件示例

    发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一: #-*- coding: UTF-8 -*- import socket,time,SocketServer,struct,os,thread host='192.168.50.74' port=12307 s=socket.socket(socket.AF_INET,socket.SOCK_S

  • C#中Socket与Unity相结合示例代码

    前言 初步接触了Socket,现使其与Unity相结合,做成一个简单的客户端之间可以互相发送消息的一个Test.下面话不多说了,来一起看看详细的介绍吧. 方法如下: 首先,是服务端的代码. 创建一个连接池,用于存储客户端的数量. using System; using System.Net; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; namespace Server

  • mysql socket文件作用详解

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,一般在配置部署mysql环境时都会在mysql的my.cnf文件中[mysqld]栈下添加上socket文件的路径,而这样做的好处是如果启用了多实例mysql时,可以通过socket文件来快速的登录mysql对应不同端口下的实例,如在一台有部署2个实例的mysql服务一个是用3306,一个是用3307端口,那么就可以通过2个不同的socket文件快速的登录 mysql -uroot -p --socket=

随机推荐