使用socket创建服务器进程和客户端进程
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创建服务器进程和客户端进程相关推荐
- python应用系列教程——python使用socket创建udp服务器端和客户端
全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建udp服务器端和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户 ...
- JAVA服务器没回应_Java Socket为什么服务器无法回复客户端
Java Socket为什么服务器无法回复客户端 我想写代码让客户端发送一个字符串给Server,Server打印字符串并回复一个字符串,然后Client打印字符串Server reply. 我的服务 ...
- Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输)、监控客户端屏幕(UDP传输),抖动用户窗体、发送文件给用户、扫描客户的C盘目录。
用VS2015工具C#语言编写了一个简单的Socket异步服务器,可以监控客户端的状态,功能有,文字测试,服务端向客户端传输屏幕录像(UDP传输).监控客户端屏幕(UDP传输),抖动用户窗体.发送文件 ...
- java20 创建服务器:ServerSocket
创建服务器:ServerSocketimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- python应用系列教程——python使用socket创建tcp服务器和客户端
全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建tcp服务器和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户输 ...
- 读取服务器进程信息,服务器读取客户端进程
服务器读取客户端进程 内容精选 换一换 用户更改dhcp租约时间后,只有在ECS实例获取到新的租约后配置才会生效.存量ECS实例不会立即刷新租约,而是要等到当前租约续租时才会更新租约.续租时间为当前租 ...
- Android系统中的进程管理:进程的创建
对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...
- day06 : 01 Oracle 体系结构概念,内存结构,内存结构(服务器进程和用户进程)
一 概念: 1. 实例/instance: 后台进程+共享内存 用于管理和控制数据库 数据库/database: 物理文件的集合 为实例提供数据,如数据文件,控制文件,参数文件,日志文件等 ...
- 如何查看服务器文件进程,如何查看服务器上的所有进程
如何查看服务器上的所有进程 内容精选 换一换 华为云SSL证书管理服务帮助中心,为用户提供产品简介.用户指南.常见问题等技术文档,帮助您快速上手使用云证书管理服务. 分析辅助软件是一款支持部署到多台服 ...
最新文章
- 蚂蚁金服提新概率图模型GLN,正确率提升8.2%,具备可解释性 | NeurIPS 2019
- 自编码clone图解
- 边缘计算架构_边缘计算到底是个什么技术?边缘计算硬件架构
- django按钮点击后想刷新当前页面的view写法
- hse不起振 stm8_STM8S207使用外部24M晶振不起振的解决办法
- Maven的单元测试没有执行的问题
- hashtable - hashmap
- mfc之DDX_Control作用
- Python会赶超Java吗_Python 赶超 Java,JavaScript 稳坐第一 | GitHub
- Mahout聚类分析
- 1-10 图灵测试:机器会思考吗? (笔记)
- LAYUI 树形表格(tree table)
- 数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。
- 如何将arcgis中shape要素文件转为mapgis中点线面
- 巧妙算法之位运算的应用
- HTTP基础知识(仅介绍涉及R语言爬虫部分)
- linux下查找配置文件
- 饿了么input框的使用
- 印度加强网络管理或部署网猫软件屏蔽Facebook
- Windows7下pip安装包报错 Microsoft Visual C++ 9 0 is required Unabl