TCP客户端和服务器创建流程在上篇博文中已经说明:

TCP客户端服务器模型创建流程

服务器进程

#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <signal.h>
#include <time.h>//测试方法,运行程序,并指定端口号8888
//在另一个终端上使用
// telnet 127.0.0.1 8888进行连接
//127.0.0.1是没有连接网络时使用的本地回环ip地址//使用浏览器测试,需要使用使用http协议进行,在浏览器中输入http://IP.8888 即可访问(本机测试)/*声明自定义函数*/
void sig_handler(int signo);
void out_addr(struct sockaddr_in *clientaddr);
void do_service(int fd);
int sockfd;int main(int argc, char * argv[])
{if(argc < 2){printf("usage: %s #port\n",argv[0]);exit(1);}if(signal(SIGINT, sig_handler) == SIG_ERR)   //开始捕捉信号  SIGINT{perror("signal sigint error!");exit(1);}/*步骤1创建socket*AF_INET IPV4*SOCK_STREAM 采用tcp协议*0 采用上面设置的协议类型*/sockfd = socket(AF_INET, SOCK_STREAM, 0);  //使用默认协议if(sockfd < 0){perror("socket error!");exit(1);}/**步骤2,:调用bind函数将socket和地址(包括 IP,port)进行绑定**/struct sockaddr_in serveraddr;  //声明专用地址,需要的时候再转换为通用地址memset(&serveraddr, 0, sizeof(serveraddr));//往地址填入ip、port、intnernet地址族类型serveraddr.sin_family = AF_INET; //IPV4serveraddr.sin_port = htons(atoi(argv[1]));  //填入端口 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(sockfd, (struct sockaddr *) &serveraddr,sizeof(serveraddr)) < 0){perror("bind error!");exit(1);}/* *步骤3:调用listen函数启动端口监听*通知系统去接受来自客户端的连接请求*listen 的第二个参数10是请求队列长度,将接收到的客户端连接请求放到对应的队列当中*/if(listen(sockfd, 10) < 0)  //10监听的队列的上限{perror("listen error!");exit(1);}/**步骤4:调用accept函数,从队列中获得*      一个客户端请求连接,并返回新的sock文件描述符fd,*      因为listen能够监听好多的连接请求,*      使用accept获得一个连接使用*      若是accept没有获得客户端连接,会进行阻塞,直到获得客户端连接*/struct sockaddr_in clientaddr;socklen_t clientaddr_len = sizeof(clientaddr);while(1){//使用循环就能够在断开与一个客户端连接之后,在连接下一个客户端连接int fd = accept(sockfd, (struct sockaddr*) &clientaddr,&clientaddr_len);if(fd < 0){perror("accept error!");continue;}/**步骤5: 调用IO函数(read/write)和连接的客户端进行双向通信**/out_addr(&clientaddr);do_service(fd);/*步骤6:关闭socket*/close(fd);}return 0;
}void sig_handler(int signo)
{if(signo == SIGINT){printf("server close\n");/*步骤6:关闭socket*/close(sockfd);exit(1);}}void out_addr(struct sockaddr_in *clientaddr)
{/*将端口网络字节序转换为主机字节序 */   /*port是short类型数据*/int port = ntohs(clientaddr->sin_port);char ip[16];memset(ip, 0, sizeof(ip));/*将ip地址从网络地址转换为点分十进制*//*需要注意的地方#include <arpa/inet.h>const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);在函数中 const void *src说明第二个参数是指针类型的数据,但是当传入clientaddr->sin_addr.s_addr == (*clientaddr).sin_addr.s_addr就不在是一个指针类型数据因此需要使用&将其取址之后在传入。*/inet_ntop(AF_INET, &clientaddr->sin_addr.s_addr, ip, sizeof(ip));printf("client: %s(%d) connected\n",ip, port);
}void do_service(int fd)
{long t = time(0);char *s = ctime(&t);size_t size = strlen(s)*sizeof(char);/*将服务器端获取的系统时间写回到客户端*/if(write(fd, s, size) != size){perror("write error!");}}

客户端进程

#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <signal.h>
#include <time.h>int main(int argc, char * argv[])
{if(argc < 3){printf("usage:%s ip port\n",argv[0]);exit(1);}/*步骤1:创建socket*/int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error!");exit(1);}/*往serveraddr中填入ip,port和地址族类型(ipv4)*/struct sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));/*将字符串ip地址转换为网络字节序填入 serveraddr中*/inet_pton(AF_INET, argv[1], &serveraddr.sin_addr.s_addr);/**步骤2: 客户端调用connect函数连接到服务器端*/if(connect(sockfd, (struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){perror("connect error!");exit(1);}/*步骤3:调用IO函数,read和write和服务器进行双向通信*/char buffer[1024];memset(buffer, 0, sizeof(buffer));size_t size;if((size = read(sockfd, buffer, sizeof(buffer))) < 0){perror("read error!");exit(1);}if(write(STDOUT_FILENO, buffer, size) != size){perror("write error!");exit(1);}/*步骤4:关闭socket套接字*/close(sockfd);return 0;
}

使用socket创建服务器进程和客户端进程相关推荐

  1. python应用系列教程——python使用socket创建udp服务器端和客户端

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建udp服务器端和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户 ...

  2. JAVA服务器没回应_Java Socket为什么服务器无法回复客户端

    Java Socket为什么服务器无法回复客户端 我想写代码让客户端发送一个字符串给Server,Server打印字符串并回复一个字符串,然后Client打印字符串Server reply. 我的服务 ...

  3. Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输)、监控客户端屏幕(UDP传输),抖动用户窗体、发送文件给用户、扫描客户的C盘目录。

    用VS2015工具C#语言编写了一个简单的Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输).监控客户端屏幕(UDP传输),抖动用户窗体.发送文件 ...

  4. java20 创建服务器:ServerSocket

    创建服务器:ServerSocketimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  5. python应用系列教程——python使用socket创建tcp服务器和客户端

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建tcp服务器和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户输 ...

  6. 读取服务器进程信息,服务器读取客户端进程

    服务器读取客户端进程 内容精选 换一换 用户更改dhcp租约时间后,只有在ECS实例获取到新的租约后配置才会生效.存量ECS实例不会立即刷新租约,而是要等到当前租约续租时才会更新租约.续租时间为当前租 ...

  7. Android系统中的进程管理:进程的创建

    对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...

  8. day06 : 01 Oracle 体系结构概念,内存结构,内存结构(服务器进程和用户进程)

    一    概念: 1. 实例/instance: 后台进程+共享内存 用于管理和控制数据库  数据库/database: 物理文件的集合 为实例提供数据,如数据文件,控制文件,参数文件,日志文件等   ...

  9. 如何查看服务器文件进程,如何查看服务器上的所有进程

    如何查看服务器上的所有进程 内容精选 换一换 华为云SSL证书管理服务帮助中心,为用户提供产品简介.用户指南.常见问题等技术文档,帮助您快速上手使用云证书管理服务. 分析辅助软件是一款支持部署到多台服 ...

最新文章

  1. 蚂蚁金服提新概率图模型GLN,正确率提升8.2%,具备可解释性 | NeurIPS 2019
  2. 自编码clone图解
  3. 边缘计算架构_边缘计算到底是个什么技术?边缘计算硬件架构
  4. django按钮点击后想刷新当前页面的view写法
  5. hse不起振 stm8_STM8S207使用外部24M晶振不起振的解决办法
  6. Maven的单元测试没有执行的问题
  7. hashtable - hashmap
  8. mfc之DDX_Control作用
  9. Python会赶超Java吗_Python 赶超 Java,JavaScript 稳坐第一 | GitHub
  10. Mahout聚类分析
  11. 1-10 图灵测试:机器会思考吗? (笔记)
  12. LAYUI 树形表格(tree table)
  13. 数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。
  14. 如何将arcgis中shape要素文件转为mapgis中点线面
  15. 巧妙算法之位运算的应用
  16. HTTP基础知识(仅介绍涉及R语言爬虫部分)
  17. linux下查找配置文件
  18. 饿了么input框的使用
  19. 印度加强网络管理或部署网猫软件屏蔽Facebook
  20. Windows7下pip安装包报错 Microsoft Visual C++ 9 0 is required Unabl

热门文章

  1. hdu 5155(DP+排列组合)
  2. SQLServer2008 Transact_SQL语言基础实例
  3. 交换机接口的access与trunk
  4. NYOJ 594 还是A+B
  5. BZOJ3451 Normal 期望、点分治、NTT
  6. 数据库表字段命名规则
  7. BZOJ1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏
  8. MySQL 特殊参数
  9. 设计模式在实际业务应用中的介绍之2——业务工厂
  10. 学习C++的五十个建议(转