#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>

#define MAXLINE 4096

void str_echo(int sockfd) {
  ssize_t n;
  char buff[MAXLINE];

  printf("----echo----\n");
  while((n = read(sockfd, buff, MAXLINE)) > 0) {
    if(write(sockfd, buff, strlen(buff)) != strlen(buff)) {
      printf("write error\n");
      exit(-1);
    }
  }
}

int main() {
  int listenfd, connfd;
  socklen_t clilen;
  pid_t pid;
  struct sockaddr_in servaddr, cliaddr;
  char buff[MAXLINE];

  listenfd = socket(AF_INET, SOCK_STREAM, 0);
  if(listenfd < 0) {
    printf("socket error\n");
    exit(-1);
  }

  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(8000);

  if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
    printf("bind error");
    exit(-1);
  }

  if(listen(listenfd, 1024) < 0) {
    printf("listen error");
    exit(-1);
  }
  printf("----server is listening----\n");

  for(;;) {
    clilen = sizeof(cliaddr);

    if((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)) < 0) {
      printf("accept error");
      exit(-1);
    }

    printf("ip: %s, port: %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), ntohs(cliaddr.sin_port));
    printf("----------connected-------\n");

    if((pid = fork()) < 0) {
      printf("fork error\n");
      exit(-1);
    }
    else if(pid == 0) { /* child */
      printf("---child pid = %ld process---\n", (long)getpid());
      if(close(listenfd) < 0) {
        printf("---child close listenfd error---\n");
        exit(-1);
      }
      str_echo(connfd);
      if(close(connfd) < 0) {
        printf("---child close connfd error---\n");
        exit(-1);
      }
      exit(0);
    }
    else { /* parent */
      if(close(connfd) < 0) {
        printf("---parent close connfd error---\n");
        exit(-1);
      }
    }
  }
  exit(0);
}

从这些代码中可以体会到客户/服务器网络应用所需的所有基本步骤。

TCP打开文件传输(服务器端并发code)的更多相关文章

  1. TCP打开文件传输(客户端code)

    #include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <sys/types. ...

  2. java实现两台电脑间TCP协议文件传输

    记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...

  3. SSH-Secure-Shell 3.2.9 build283版本,创建直接打开文件传输的快捷方式的方法

    2019-12-31 16:21:23 版本信息: 在安装目录下新建快捷方式 目标填写:"D:\SSH-Secure-Shell\SshClient.exe" /f 图标选择,系统 ...

  4. 通过TCP实现文件传输

    import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.In ...

  5. QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

    引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...

  6. Linux网络编程:UDP实现可靠的文件传输

    我们知道,用TCP实现文件传输很简单.相对于TCP,因为UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方 ...

  7. Go网络文件传输

    流程分析 借助TCP完成文件的传输,基本思路如下: 发送方(客户端)向服务端发送文件名,服务端保存该文件名. 接收方(服务端)向客户端返回一个消息ok,确认文件名保存成功. 发送方(客户端)收到消息后 ...

  8. helm-mode打开文件支持中文搜索

    helm-mode打开文件支持中文搜索 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #83949 ...

  9. TCP协议,UDP,以及TCP通信服务器的文件传输

    TCP通信过程 下图是一次TCP通讯的时序图.TCP连接建立断开.包含大家熟知的三次握手和四次握手. 在这个例子中,首先客户端主动发起连接.发送请求,然后服务器端响应请求,然后客户端主动关闭连接.两条 ...

随机推荐

  1. JS——sort

    1.a-b升序 <script> var arr = [2, 3, 1, 5, 0]; function compare(a, b) { return a - b; } console.l ...

  2. 【sqli-labs】 less51 GET -Error based -Order By Clause -String -Stacked injection(GET型基于错误的字符型Order By从句堆叠注入)

    less50的字符型版本,闭合好引号就行 http://192.168.136.128/sqli-labs-master/Less-51/?sort=1';insert into users(id,u ...

  3. iOS实现图形编程可以使用三种API(UIKIT、Core Graphics、OpenGL ES及GLKit)

    这些api包含的绘制操作都在一个图形环境中进行绘制.一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境.offscreen 位图环境和PDF图形环境,用来在屏幕表面.一个位图或一 ...

  4. 抓包工具Fiddler及Charles

    一.抓包工具介绍 1.charles抓包如何抓取手机端数据包(安卓手机) (1)获取pc的IP地址 (2)打开charles里的[Proxy]-[Proxy setting],设置端口号,默认为888 ...

  5. Object.create() __https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

    Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象. 语法 Object.create(proto[, propertiesObject]) 参数 proto 新创建对 ...

  6. Echarts 动态更新散点图

      最近遇到一个作业,要求使用 Echarts 散点图,本来这个图是很容易的,官网上也有很多的教程.但是如果可以动态的更新 Echarts 散点图就更好了.我本身对 js 不感兴趣,经过不停的查找资料 ...

  7. Shell脚本备份文件

    使用crontab 定时备份文件 1. 编辑crontab规则 2. 编写shell脚本 cp -R "/data/www/code" "/home/backup/cod ...

  8. 00.Python中下划线的5种含义

    转自这里 先放上 简短的"速查表",罗列了五种Python下划线模式的含义: 模式 举例 含义 单前导下划线 _var 命名约定,仅供内部使用.通常不会由Python解释器强行执行 ...

  9. odoo 权限杂记

    最近做一个任务督办模块,涉及到一些权限问题,折磨了几天,终于是解决了. 任务表中关联了hr_employee,分别有默认字段创建人,Many2one的发布人.监督人和Many2many类型的主责人,这 ...

  10. jquery源码分析(七)——事件模块 event(二)

    上一章节探讨了事件的一些概念,接下来看下jQuery的事件模块. jQuery对事件的绑定分别有几个API:.bind()/.live()/.delegate()/.on()/click(), 不管是 ...