简单的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
随机推荐
- CTF-WeChall-第二天
2020.09.10 奥力给,举步维艰的时候就是要一边做一遍记,虽然慢但是不要嫌弃,要不然就是举步不前
- [程序员代码面试指南]字符串问题-字符串匹配问题(DP)
问题描述 字符串str,模式串exp. 必须保证str中无'.'和'星号'字符,并且exp中'星号'不出现在首位,且无连续两个'星号'.PS星号是字符只是暂时没找到markdown的星号转义字符. ' ...
- 常见重构技巧 - 5种方式去除多余的if else
常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...
- in多值优化
〇.问题 今天ocp群里有人问 SELECT * FROM table WHERE id IN(11,2,3,44,...) 在in里面有大量数据4000+,有什么 好的处理方式吗? 我的优化方案的总 ...
- 技术解析丨C++元编程之Parser Combinator
摘要:借助C++的constexpr能力,可以轻而易举的构造Parser Combinator,对用户定义的字符串(User defined literal)释放了巨大的潜力. ## 引子 前不久在C ...
- python的多种魔术方法
目录 new str & repr iter getitem.setitem.delitem getattr.setattr.delattr call slots 定制类和魔法方法 new s ...
- SpringBoot-03-配置之yaml语法学习
3. SpringBoot配置 3.1 yaml语法学习 配置文件 Springboot使用一个全局的配置文件,配置文件名称固定 spplication.properties 语法结构:key=val ...
- 2020年秋季最新Python详细入门教程!全网最新最全
1. import # -*- coding: utf-8 -*- ## 引入新的包 import turtle import pickle # 文件操作 import tensorflow as t ...
- php bypass disable function
前言 最近开学,事太多了,好久没更新了,然后稍微闲一点一直在弄这个php bypass disable function,一开始自己的电脑win10安装蚁剑的插件,一直报错.怀疑是必须linux环境. ...
- 逻辑漏洞介绍 & 越权访问攻击 & 修复建议
介绍逻辑漏洞 逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性.一般出现在密码修改.越权访问.密码找回.交易支付金额等功能处.其中越权访问又有水平越权和垂直越权两种,如下所示. ...