第一种普通的read recv write

Makefile

#LOCAL_LIBRARY +=  -L./lib -lpal
#LOCAL_LDFLAGS += -lm -lopus -lwebsockets -lpthread -ldl
#LOCAL_CFLAGS += -I./include
#
#
TARGETS1 = client
TARGETS2 = service
CC:=gcc SRCS1 = client.cc process.cc
SRCS2 = server.cc process.cc
OBJS1 = $(patsubst %.cc, %.o, $(SRCS1))
OBJS2 = $(patsubst %.cc, %.o, $(SRCS2)) CFLAGS += $(LOCAL_CFLAGS)
LDFLAGS += $(LOCAL_LIBRARY) $(LOCAL_LDFLAGS) all: $(TARGETS1) $(TARGETS2) $(TARGETS1):$(OBJS1)
$(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) $(TARGETS2):$(OBJS2)
$(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) $(OBJS1): %.o:%.cc
$(CC) -c $< -o $@ $(CFLAGS) $(OBJS2): %.o:%.cc
$(CC) -c $< -o $@ $(CFLAGS)
clean :
@rm -rf $(TARGETS1) $(OBJS1) #.SUFFIXES:
.PHONY : all clean

客户端的处理函数

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
extern void sig_proccess(int signo);
extern void sig_pipe(int signo);
extern void process_conn_client(int signo);
static int s;
void sig_proccess_client(int signo)
{
printf("Catch a exit signal\n");
close(s);
exit(0);
}
#define PORT 8888
int main(int argc,char *argv[])
{
struct sockaddr_in server_addr;
int err; if(argc == 1)
{
printf("PLS input server addr\n");
return 0;
}
signal(SIGINT, sig_proccess);
signal(SIGPIPE, sig_pipe); s = socket(AF_INET, SOCK_STREAM, 0);
if(s < 0)
{
printf("socket error\n");
return -1;
}
/*设置服务器地址*/
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT); inet_pton(AF_INET, argv[1], &server_addr.sin_addr); connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)); process_conn_client(s);
close(s);
return 0;
}

服务端的处理函数

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/unistd.h>
#include <netinet/in.h>
#include <signal.h>
extern void sig_proccess(int signo);
extern void process_conn_server(int signo);
#define PORT 8888
#define BACKLOG 2
int main(int argc, char *argv[])
{
int ss,sc;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid;
signal(SIGINT, sig_proccess);
signal(SIGPIPE, sig_proccess); ss = socket(AF_INET, SOCK_STREAM, 0);
if(ss < 0)
{
printf("socket error\n");
return -1;
} bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT); err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(err < 0)
{
printf("listen error %d \n",errno);
return -1;
}
err =listen(ss, BACKLOG);
if(err < 0)
{
printf("listen error\n");
return -1;
} for(;;)
{
socklen_t addrlen = sizeof(struct sockaddr);
sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
if(sc < 0)
{
continue;
} pid = fork();
if( pid == 0 )
{
close(ss);
process_conn_server(sc);
}else{
close(sc);
}
}
}

公用的处理函数

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/*服务器对客户端的处理*/
void process_conn_server(int s)
{
ssize_t size = 0;
char buffer[1024]; /*数据的缓冲区*/ for(;;){ /*循环处理过程*/
size = recv(s, buffer, 1024,0);
/*从套接字中读取数据放到缓冲区buffer中*/
if(size == 0){ /*没有数据*/
return;
} sprintf(buffer, "%d bytes altogether\n", size);
/*构建响应字符,为接收到客户端字节的数量*/
send(s, buffer, strlen(buffer)+1,0); /*发给客户端*/
}
} /*客户端的处理过程*/
void process_conn_client(int s)
{
ssize_t size = 0;
char buffer[1024]; /*数据的缓冲区*/ for(;;){ /*循环处理过程*/
size = read(0, buffer, 1024);
/*从标准输入中读取数据放到缓冲区buffer中*/
if(size > 0){ /*读到数据*/
send(s, buffer, size,0); /*发送给服务器*/
size = recv(s, buffer, 1024,0); /*从服务器读取数据*/
write(1, buffer, size); /*写到标准输出*/
}
}
} /*信号SIGINT的处理函数*/
void sig_proccess(int signo)
{
printf("Catch a exit signal\n");
_exit(0);
} /*信号SIGPIPE的处理函数*/
void sig_pipe(int sign)
{
printf("Catch a SIGPIPE signal\n"); /*释放资源*/
}

客户端和服务端通信的多种函数的对比。linux 网络编程的更多相关文章

  1. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

  2. Netty入门——客户端与服务端通信

    Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...

  3. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  4. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

  5. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  6. netty-3.客户端与服务端通信

    (原) 第三篇,客户端与服务端通信 以下例子逻辑: 如果客户端连上服务端,服务端控制台就显示,XXX个客户端地址连接上线. 第一个客户端连接成功后,客户端控制台不显示信息,再有其它客户端再连接上线,则 ...

  7. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

  8. 实验09——java基于TCP实现客户端与服务端通信

    TCP通信         需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手        底层通过 流 发送数据 数据没有大小限制        可靠的传输机制 - 丢包重发 包的顺序的 ...

  9. 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...

  10. mina客户端与服务端通信的易错点

    使用mina进行项目开发时,如果客户端与服务端不在同一个项目下,需要关注一下两点: 第一.服务端与客户端的编码解码器一致 第二.过程中所用到的实体类的包名需要一致

随机推荐

  1. Vue的前端项目开发环境搭建

    一.本机window端:安装Node.js,其实质性功能相当于,java的maven https://nodejs.org/en/download/ 二.本机window端:检查Node.js的版本 ...

  2. Linux使用.net core

    Linux使用.net core .wiz-editor-body .wiz-code-container { position: relative; padding: 8px 0; margin: ...

  3. Java编程--单例(Singleton)设计模式

    单例设计模式 一个类只有一个实例,根据创建的时机又分为懒汉式和饿汉式,它们的区别主要体现在实例的创建时机和线程安全性上. 饿汉式(Eager Initialization): 特点: 在类加载时就创建 ...

  4. 一站式搭建交友平台-交友系统源码-支持H5小程序+带安装说明+可封装APP-交友网站系统平台搭建

    诺诺婚恋交友系统 1.系统基于TP6+Uni-app框架开发:客户移动端采用uni-app开发,管理后台TH6开发. 2.系统支持微信公众号端.微信小程序端.H5端.PC端多端账号同步,可快速打包生成 ...

  5. 后缀数组(SA)

    后缀数组 P3809 [模板]后缀排序 定义: 对给定字符串的所有后缀排序后得到的sa.rk数组 sa[i]->排名为i的后缀的位置 rk[i]->位置为i的后缀的排名 容易发现,sa与r ...

  6. Qml Console

    动机:qmlconsole类似于chrome浏览器的devtool.用于运行时调试qml代码.用javascript控制台,执行指令.包括本软件提供的内置函数. 本项目整合到KTL项目上.但是KTL使 ...

  7. SQL 强化练习 (十三)

    这几天都在整帆软报表, 还要弄 RPA ... 咱说呢, 这些破玩意, 是提升了业务人员的工作效率, 但, 极大降低了我的工作效率, 明明写代码就能解决, 非要各种 点点点... 文档也不全, 就很难 ...

  8. c++并发编程实战-第4章 并发操作的同步

    等待事件或等待其他条件 坐车案例 想象一种情况:假设晚上坐车外出,如何才能确保不坐过站又能使自己最轻松? 方法一:不睡觉,时刻关注自己的位置 1 #include <iostream> 2 ...

  9. 提示词工程:引导AI高效完成任务的艺术

    提示词工程(Prompt Engineering)是人工智能时代的一项关键技能,它研究如何设计最佳提示词,以引导大型语言模型产生我们所需的结果.本文将深入探讨提示词工程的核心概念.组成部分及其与微调的 ...

  10. Spring扩展接口-ApplicationContextInitializer

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...