首先是我的一个出错提示的头文件<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. 微信小程序-组件-视图容器

    1.view 1.作用:类似 html 的 div 用来进行页面布局,具有块级盒子特性. 2.常用属性:设置view盒子点击后的状态,以及控制是否影响父盒子的点击状态 3.eg:<view ho ...

  2. IAR错误Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. At least 0xd more bytes needed. The problem occurred while processing the segment 的解决办法

    IAR for 8051 IDE version 9.10.1编译阿莫单片机的cc2541程序osal第一节教程出现错误如下 出错的愿意是iar设置错误.所以需修改IAR的设置. 解决办法如下: 即可 ...

  3. [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)

    题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...

  4. vue-element-admin改造接入后台,搭建有来商城youlai-mall前后端分离管理平台

    一. 前言 本篇基于有来商城youlai-mall微服务项目搭建的后台前端管理平台,技术选型Vue+Element-UI实现前后端分离,解决方案选型vue-element-admin.希望通过本篇你可 ...

  5. .net 中的 StringBuilder 和 TextWriter 区别

    最近闲来之余,看了一些开源的类库,看到有些类库喜欢用TextWriter类来记录相关的字符串数据,感到比较好奇,为啥不用StringBuilder类对象.于是在网上搜索了一番,总结了相关笔记. Str ...

  6. 关于java基础_方法的简单习题

    package day05; import java.util.Arrays; /** * 方法作业 * @author ASUS * */ public class Demo6 { /* * 1.定 ...

  7. 秋招进大厂其实也就那么回事,你会这样卡进大厂的BUG吗?

    在BAT这种大厂里,只要肯吃苦,技术和工资进步的速度会超出你想象,我在上海,按当前价格算,一般在大厂里干个三四年,好歹房子的首付应该能有,而且这种房子还不是太偏远太小的. 进大厂确实需要一定的实力,但 ...

  8. top、ps -ef、ps aux的区别及内容详解

    1.top和ps的区别 ps是静态查看进程--------top是动态(持续监控)进程 ps只是查看进程-----------top还可以监视系统性能,如平均负载,cpu和内存的消耗 2.ps -ef ...

  9. jekins使用的坑

    1.日志打满 一个周末回来,服务器的磁盘就写满了 现象如下,最后是修改catalina脚本 添加了如下配置 ###jekins log problem#########export JAVA_OPTS ...

  10. Oracle学习(十二)标量函数

    UCASE()大写转换  LCASE()小写转换 --把查询结果对应的列进行大写转换 SELECT UCASE(列) FROM 表; --把查询结果对应的列进行小写转换 SELECT LCASE(列) ...