首先是我的一个出错提示的头文件<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通信,小程序,方便以后查看。的更多相关文章

  1. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  2. c++ 网络编程(二) linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html 锲子-- 预备知识优雅的关闭套接字连接: 基于TCP的半关闭 TCP中的 ...

  3. linux下实现进度条小程序

    转载自:实现一个简单的进度条 我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在linux下实现这个进度条的功能. 1.我们使用的关键打印语句是printf函数: printf(&quo ...

  4. Linux下多任务间通信和同步-信号

    Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...

  5. Linux下多任务间通信和同步-概述

    Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...

  6. Linux下提权常用小命令

    有些新手朋友在拿到一个webshell后如果看到服务器是Linux或Unix操作系统的就直接放弃提权,认为Linux或Unix下的提权很难,不是大家能做的,其实Linux下的提权并没有很多人想象的那么 ...

  7. Linux下多任务间通信和同步-mmap共享内存

    Linux下多任务间通信和同步-mmap共享内存 嵌入式开发交流群280352802,欢迎加入! 1.简介 共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射 ...

  8. Linux下多任务间通信和同步-消息队列

    Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...

  9. Linux下unix socket 读写 抓包

    Linux下unix socket 读写 抓包-ubuntuer-ChinaUnix博客 http://blog.chinaunix.net/uid-9950859-id-247877.html

随机推荐

  1. IEDA使用Tomcat后控制台中文出现乱码

    如下图所示,Intellij IDEA显示中文为乱码, 根据Intellij IDEA控制台输出,Tomcat  Log出现乱码,因此可以将问题定位到Tomcat上,具体解决方法: 第一步:打开Tom ...

  2. 字符串split的用法

    拆分字符串:张三:20|李四:40|王五:40 这个可以使用两次分割,第一次使用 | 分割,放到arr数组里,然后使用循环对arr[i]进行使用:分割 public static void main( ...

  3. Linux:apache目录结构和配置文件详解

    bin目录下的常见命令 conf目录 htdocs目录 logs目录 httpd.conf文件解析. 如果后期自己新创建了新的站点目录,就要重新增加对应的目录权限配置 extra/目录下配置文件解析 ...

  4. [LeetCode]301. 删除无效的括号(DFS)

    题目 题解 step1. 遍历一遍,维护left.right计数器,分别记录不合法的左括号.右括号数量. 判断不合法的方法? left维护未匹配左括号数量(增,减)(当left为0遇到右括号,则交由r ...

  5. istio 常见的 10 个异常

    总结使用 istio 常见的10个异常: Service 端口命名约束 流控规则下发顺序问题 请求中断分析 sidecar 和 user container 启动顺序 Ingress Gateway ...

  6. Netty中的一些注意事项--底层基础

    转载自http://www.mamicode.com/info-detail-1215305.html 最近开发了一个纯异步的redis客户端,算是比较深入的使用了一把netty.在使用过程中一边优化 ...

  7. Java审计之文件操作漏洞

    Java审计之文件操作漏洞篇 0x00 前言 本篇内容打算把Java审计中会遇到的一些文件操作的漏洞,都给叙述一遍.比如一些任意文件上传,文件下载,文件读取,文件删除,这些操作文件的漏洞. 0x01 ...

  8. java面试题2-自己整合的

    1.HashMap的底层实现原理 HashMap是数组+链表组成的实现了Map.Cloneable.Serializable接口,继承了AbstractMap类 HashMap是否线程安全? Hash ...

  9. maven打包(jar)类型错误

    maven项目打包测试环境时部署发现是开发环境.确认打包命令无误, 此情况下将target内容全部删除,重新打包即可.是全部删除.

  10. 趣图:我说自己菜 vs 大佬说自己菜

      扩展阅读 一大波趣图:CSS的力量 趣图:嫁人就嫁程序员,大妈都懂的! 趣图:向客户介绍的产品VS实际开发的产品 如何准备校招技术面试+一只小菜鸟的面试之路 向Spring大佬低头--大量源码流出 ...