简单的Linux下的socket通信,小程序,方便以后查看。
首先是我的一个出错提示的头文件<myerr.h>,自从用了根本停不下来啊!!!
#ifndef _MYERR_H_
#define _MYERR_H_
#include <stdio.h>
#include <string.h>
#include <errno.h>
extern int errno;
#define MYDBG
#ifdef MYDBG
#define PRN_ERRMSG_EXIT(errmsg) \
({ \
fprintf(stderr, "Say->%s : File->%s : Line->%d : Fun->%s : Cause->%s\n\r", \
errmsg,__FILE__,__LINE__,__func__,strerror(errno)); \
exit(-1); \
})
#else
#define PRN_ERRMSG_EXIT(errmsg) ({exit(-1);})
#endif
#ifdef MYDBG
#define PRN_ERRMSG_RETURN(errmsg) \
({ \
fprintf(stderr, "Say->%s : File->%s : Line->%d : Fun->%s : Cause->%s\n\r", \
errmsg,__FILE__,__LINE__,__func__,strerror(errno)); \
return(-1); \
})
#else
#define PRN_ERRMSG_RETURN(errmsg) ({return(-1);})
#endif
#ifdef MYDBG
#define PRN_ERRMSG(errmsg) \
({ \
fprintf(stderr, "Say->%s : File->%s : Line->%d : Fun->%s : Cause->%s\n\r", \
errmsg,__FILE__,__LINE__,__func__,strerror(errno)); \
})
#else
#define PRN_ERRMSG(errmsg)
#endif
#ifdef MYDBG
#define ASSERT(EXP) \
({\
if(!(EXP)){\
fprintf(stderr, "Say->%s : File->%s : Line->%d : Fun->%s : Cause->%s\n\r", \
__FILE__,__LINE__,__func__,strerror(errno)); \
exit(-1); \
}\
})
#else
#define ASSERT(EXP)
#endif
#endif //_ERROR_H_
然后就是我编写的简便代码,方便其他地方调用额。<socket.c>
#include "mysocket.h"
int ser_socket(const char *ipstr, const unsigned short port)
{
/*创建一个流式套接字*/
int s = socket(PF_INET, SOCK_STREAM, 0);
if (0 > s)
PRN_ERRMSG_RETURN("socket");
int on = 1;
if (0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
PRN_ERRMSG_RETURN("setsockopt");
struct sockaddr_in addr = {
.sin_family = PF_INET,
.sin_port = htons(port),
.sin_addr.s_addr = (NULL==ipstr)?INADDR_ANY:inet_addr(ipstr),
};
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
if (0 > bind(s, (struct sockaddr*)&addr, sizeof(struct sockaddr)))
PRN_ERRMSG_RETURN("bind");
if (0 > listen(s, BACKLOG))
PRN_ERRMSG_RETURN("listen");
return s;
}
int cli_socket(const char *ipstr, const unsigned short port)
{
/*创建一个流式套接字*/
int s = socket(PF_INET, SOCK_STREAM, 0);
if (0 > s)
PRN_ERRMSG_RETURN("socket");
struct sockaddr_in addr = {
.sin_family = PF_INET,
.sin_port = htons(port),
.sin_addr.s_addr = inet_addr(ipstr),
};
memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
if (0 > connect(s, (struct sockaddr*)&addr, sizeof(struct sockaddr)))
PRN_ERRMSG_RETURN("connect");
return s;
}
int my_accept(int sockFd, struct sockaddr_in *addr)
{
socklen_t len = sizeof(struct sockaddr_in);
memset(addr, 0, len); // 将结构体清零
int rws = accept(sockFd, (struct sockaddr*)addr, &len);
if (0 > rws)
PRN_ERRMSG_RETURN("accept");
return rws;
}
当然也要为这个文件编写头文件了。。。<mysocket.h>
#ifndef _SOCKET_H_
#define _SOCKET_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <myerr.h>
#define BACKLOG 5 /* length of listening queue on socket */
/*
* 服务器开启服务
* ipstr : 服务器ip
* port : 绑定的端口
* 返回 : 一个网络套接字
*/
int ser_socket(const char *ipstr, const unsigned short port);
/*
* 客户端连接服务器
* ipstr : 服务器ip
* port : 服务器的端口
* 返回 : 一个网络套接字
*/
int cli_socket(const char *ipstr, const unsigned short port);
/*
* 等待客户端连接
* sockFd : 套接字
* addr : 接收客户端信息
* 返回 : 与客户端通信的文件描述副
*/
int my_accept(int sockFd, struct sockaddr_in *addr);
#endif //_SOCKET_H_
然后就是服务器的代码了。<main_ser.c>
#include "mysocket.h"
int main(int argc,char *argv[])
{
int serFd = ser_socket(NULL, 8888);
struct sockaddr_in addr;
char buffer[1024];
while (1) {
int accFd = my_accept(serFd, &addr);
while (1) {
memset(buffer, 0, 1024);
if (0 >= recv(accFd, buffer, 1024, 0)) {
PRN_ERRMSG("recv");
close(accFd);
break;
}
printf("client : %s\n", buffer);
if (0 > send(accFd, buffer, strlen(buffer), 0)) {
PRN_ERRMSG("recv");
close(accFd);
break;
}
}
}
return 0;
}
然后就是客户端的代码了<main_cli.c>
#include "mysocket.h"
int main(int argc,char *argv[])
{
int sockFd = cli_socket("127.0.0.1", 8888);
char buffer[1024];
while (1) {
printf("input :");
fgets(buffer, 1024, stdin);
*strchr(buffer, '\n') = '\0';// 采用这种方法可以避免输入超出缓冲区
if (0 > send(sockFd, buffer, strlen(buffer), 0)) {
PRN_ERRMSG("recv");
close(sockFd);
break;
}
memset(buffer, 0, 1024);
if (0 >= recv(sockFd, buffer, 1024, 0)) {
PRN_ERRMSG("recv");
close(sockFd);
break;
}
printf("server : %s\n", buffer);
}
return 0;
}
好啦。。以后需要用的时候再来看看额。。。
简单的Linux下的socket通信,小程序,方便以后查看。的更多相关文章
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- c++ 网络编程(二) linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html 锲子-- 预备知识优雅的关闭套接字连接: 基于TCP的半关闭 TCP中的 ...
- linux下实现进度条小程序
转载自:实现一个简单的进度条 我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在linux下实现这个进度条的功能. 1.我们使用的关键打印语句是printf函数: printf(&quo ...
- Linux下多任务间通信和同步-信号
Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...
- Linux下多任务间通信和同步-概述
Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...
- Linux下提权常用小命令
有些新手朋友在拿到一个webshell后如果看到服务器是Linux或Unix操作系统的就直接放弃提权,认为Linux或Unix下的提权很难,不是大家能做的,其实Linux下的提权并没有很多人想象的那么 ...
- Linux下多任务间通信和同步-mmap共享内存
Linux下多任务间通信和同步-mmap共享内存 嵌入式开发交流群280352802,欢迎加入! 1.简介 共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射 ...
- Linux下多任务间通信和同步-消息队列
Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...
- Linux下unix socket 读写 抓包
Linux下unix socket 读写 抓包-ubuntuer-ChinaUnix博客 http://blog.chinaunix.net/uid-9950859-id-247877.html
随机推荐
- 基于arm v8搭建区块链环境
服务器信息: cpu:华为鲲鹏 cpu架构:arm v8 系统:CenOS-AltArch 7.6 相关工具安装 yum更新 yum update 安装vim/gcc/git/curl工具软件 yum ...
- Nginx之rewrite使用
rewrite regex replacement [flag]; flag=[break/last/redirect/permanent] ² regex 是正则表达式 ² replacement ...
- Istio 运维实战系列(1):应用容器对 Envoy Sidecar 的启动依赖问题
本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 故障现象 该问 ...
- SpringIOC初始化过程--详解
SpringIOC初始化过程 相信大家都知道Spring这个东西,我们经常来用他一些特性,比如说他的AOP,IOC,那今天就带大家解析下SpringIOC的加载过程. 我们来看一个例子 Annotat ...
- Superset 0.37 发布——颜值最高的数据可视化平台
Superset 0.37,增加可视化插件,行级权限控制 使用Superset已经有一段时间,其良好的体验与丰富的图表功能节省了大量的时间.但是对于权限,自定义图表,图表下载,报警邮件一直没有很好的支 ...
- Unit3:控件\布局
控件 TextView <TextView android:layout_width="match_parent" android:layout_height="w ...
- [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0 ...
- 基于k8s的集群稳定架构
前言 我司的集群时刻处于崩溃的边缘,通过近三个月的掌握,发现我司的集群不稳定的原因有以下几点: 1.发版流程不稳定 2.缺少监控平台[最重要的原因] 3.缺少日志系统 4.极度缺少有关操作文档 5.请 ...
- profile对比std::regex与boost::regex的性能
c++11标准库的regex比boost库的regex之间的性能差距接近5倍,这是为什么?stackflow上也找到一篇post<c++11 regex slower than python&g ...
- 永远不要在代码中使用“User”这个单词
当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上.现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预 ...