文章目录

  • 一、网络编程
    • 1、socket服务端代码实现(无连接客户端)
    • 6、socket服务端代码实现(连接客户端)
    • 7、socket客户端代码实现
    • 8、实现双方聊天
    • 9、多方消息收发
  • 二、往期文章

一、网络编程

1、socket服务端代码实现(无连接客户端)

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>int main()
{int s_fd;//1.sockets_fd = socket(AF_INET,SOCK_STREAM,0);if(s_fd == -1){perror("socked");exit(-1);}struct sockaddr_in s_addr;s_addr.sin_family = AF_INET;s_addr.sin_port = htons(8989);//s_addr.sin_addr.s_addr = "127.0.0.1";  (error)inet_aton("192.168.22.148",&s_addr.sin_addr);        //虚拟机linux的ip地址//2.bindbind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//3.listenlisten(s_fd,10);//4.acceptint c_fd = accept(s_fd,NULL,NULL);//5.read//6.writeprintf("connect\n");while(1);return 0;
}

输出结果:

window系统

6、socket服务端代码实现(连接客户端)

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>//int socket(int domain, int type, int protocol);
//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);int main()
{int s_fd;int n_read;char readBuf[128];//定义一个数组char *msg = "I got your message";struct sockaddr_in s_addr;struct sockaddr_in c_addr;memset(&s_addr,0,sizeof(struct sockaddr_in));    //一般来说先清空空间数据,再配置。避免结构体里面有杂乱数据memset(&c_addr,0,sizeof(struct sockaddr_in));//1.sockets_fd = socket(AF_INET,SOCK_STREAM,0);if(s_fd == -1){perror("socked");exit(-1);}s_addr.sin_family = AF_INET;s_addr.sin_port = htons(8988);//s_addr.sin_addr.s_addr = "127.0.0.1";  (不是这样写的)inet_aton("192.168.22.148",&s_addr.sin_addr);//2.bindbind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//3.listenlisten(s_fd,10);//4.acceptint clen = sizeof(struct sockaddr_in);//长度int c_fd = accept(s_fd,(struct sockaddr *)&c_addr, &clen);if(c_fd == -1){perror("accept");}//成功则打印客户端ip地址printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));    //inet_ntoa()函数,把网络格式的 IP 地址转为字符串形式//==================服务端与客户端之间数据交互======================================//5.readn_read = read(c_fd,readBuf,128);//把客户端的内容读到readBufif(n_read == -1){perror("read");}else{printf("get message: %d,%s\n",n_read,readBuf);//打印readBuf中内容}//6.writewrite(c_fd,msg,strlen(msg));//写入操作//===============================================================================return 0;
}

输出结果:

7、socket客户端代码实现

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main()
{int c_fd;int n_read;char readBuf[128];struct sockaddr_in c_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));//1.socketc_fd = socket(AF_INET,SOCK_STREAM,0);if(c_fd == -1){perror("socked");exit(-1);}c_addr.sin_family = AF_INET;c_addr.sin_port = htons(8988);//s_addr.sin_addr.s_addr = "127.0.0.1";  //(不是这样写的)inet_aton("192.168.22.148,&c_addr.sin_addr);//2.connectif(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in)) == -1){perror("connect");exit(-1);            //连接不到服务端会阻塞,出错直接跳出程序,以免搞崩代码}//3.sendwrite(c_fd,msg,128);//==================读取服务端的信息===============================//4.readn_read = read(c_fd,readBuf,128);if(n_read == -1){perror("read");}else{printf("get message from server: %d ,%s\n",n_read,readBuf);}
//================================================================ return 0;
}

8、实现双方聊天

  • server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(int argc,char **argv)
{int s_fd;int c_fd;int n_read;char readBuf[128];char *msg = "I got your message";struct sockaddr_in s_addr;struct sockaddr_in c_addr;memset(&s_addr,0,sizeof(struct sockaddr_in));memset(&c_addr,0,sizeof(struct sockaddr_in));if(argc != 3){                                //判断一下参数,否则运行参数没写对的时候,出现段错误不知道是哪里搞错。printf("param isn't right\n");}//1.sockets_fd = socket(AF_INET,SOCK_STREAM,0);if(s_fd == -1){perror("socked");exit(-1);}s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));//s_addr.sin_addr.s_addr = "127.0.0.1";  (error)inet_aton(argv[1],&s_addr.sin_addr);//2.bindbind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//3.listenlisten(s_fd,10);//4.acceptint clen = sizeof(struct sockaddr_in);while(1){c_fd = accept(s_fd,(struct sockaddr *)&c_addr, &clen);if(c_fd == -1){perror("accept");}printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));if(fork() == 0){//5.readn_read = read(c_fd,readBuf,128);if(n_read == -1){perror("read");}else{printf("get message: %d ,%s\n",n_read,readBuf);}//6.writewrite(c_fd,msg,strlen(msg));break;    //子进程做完一次就退出,父进程继续接收数据}}return 0;
}
~
  • client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(int argc,char **argv)
{int c_fd;int n_read;char readBuf[128];char *msg = "from client msg";struct sockaddr_in c_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));if(argc != 3){                            //判断一下参数,否则参数没写对的时候,出现段错误不知道是哪里搞错。printf("param isn't right\n");}//1.socketc_fd = socket(AF_INET,SOCK_STREAM,0);if(c_fd == -1){perror("socket");exit(-1);}c_addr.sin_family = AF_INET;c_addr.sin_port = htons(atoi(argv[2]));//s_addr.sin_addr.s_addr = "127.0.0.1";  (error)inet_aton(argv[1],&c_addr.sin_addr);//      memset(&c_addr,0,sizeof(struct sockaddr_in));   (error:清空位置不对)                    //2.connectif(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in)) == -1){perror("connect");exit(-1);}//3.sendint n_write = write(c_fd,msg,strlen(msg));if(n_write == -1){perror("write:");}//4.readn_read = read(c_fd,readBuf,128);if(n_read == -1){perror("read");}else{printf("get message from server: %d ,%s\n",n_read,readBuf);}return 0;
}

输出结果:

9、多方消息收发

  • server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int mark=0;int s_fd;int c_fd;int n_read;int n_write;char readBuf[128];char returnMsg[128]={0};struct sockaddr_in c_addr;struct sockaddr_in s_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));memset(&s_addr,0,sizeof(struct sockaddr_in));//数据清空if(argc != 3){printf("参数出错\n");exit(-1);}//1.socket  int socket(int domain, int type, int protocol);s_fd=socket(AF_INET,SOCK_STREAM,0);//ipv4   tcp协议if(s_fd == -1){printf("创建socket失败");perror("socket:");exit(-1);}//2.bind  int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);s_addr.sin_family=AF_INET;//ipv4s_addr.sin_port=htons(atoi(argv[2]));//端口号,选择5000以上。honts返回网络字节序,atoi(argv[2])防止端口被占用//int inet_aton(const char *cp, struct in_addr *inp)inet_aton(argv[1],&s_addr.sin_addr);//转换为网络能识别的格式bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//3.listen int listen(int sockfd, int backlog);listen(s_fd,10);//监听10个连接//4.accept int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);int client=sizeof(struct sockaddr_in);while(1){//不断接收客户端c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&client);if(c_fd == -1){printf("连接失败\n");perror("accept:");exit(-1);}printf("客户端的ip:%s\n",inet_ntoa(c_addr.sin_addr)); //把网络格式的ip地址打印成字符串格式mark++;if(fork() == 0){if(fork() == 0){while(1){sprintf(returnMsg,"欢迎第%d号客户端",mark);//6.write ssize_t write(int fd, const void *buf, size_t count);n_write=write(c_fd,returnMsg,strlen(returnMsg));sleep(20);}}while(1){//5.read  ssize_t read(int fd, void *buf, size_t count);memset(readBuf,0,sizeof(readBuf));n_read=read(c_fd,readBuf,128);if(n_read == -1){perror("read:");}else{printf("得到%d号的消息:%s\n",mark,readBuf);}}}}return 0;
}
  • client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int c_fd;int n_read;int n_write;int c_connect;char readBuf[128];char returnMsg[128]={0};char *quit="quit";struct sockaddr_in c_addr;memset(&c_addr,0,sizeof(struct sockaddr_in));//数据清空if(argc != 3){printf("参数出错\n");exit(-1);}//1.socket  int socket(int domain, int type, int protocol);c_fd=socket(AF_INET,SOCK_STREAM,0);//ipv4   tcp协议if(c_fd == -1){printf("创建socket失败");perror("socket:");exit(-1);}c_addr.sin_family=AF_INET;//ipv4c_addr.sin_port=htons(atoi(argv[2]));//端口号,选择5000以上。honts返回网络字节序//int inet_aton(const char *cp, struct in_addr *inp)inet_aton(argv[1],&c_addr.sin_addr);//转换为网络能识别的格式//2.connect  int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);c_connect=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr));if(c_connect == -1){printf("连接失败\n");perror("connect:");}while(1){if(fork() == 0){while(1){//不断写入memset(returnMsg,0,sizeof(returnMsg));printf("请输入:\n");gets(returnMsg);//3.write/send ssize_t write(int fd, const void *buf, size_t count);n_write=write(c_fd,returnMsg,strlen(returnMsg));if(strcmp(quit,returnMsg) == 0){//如果输入quit则客户端就退出exit(0);}}}while(1){//不断读取memset(readBuf,0,sizeof(readBuf));//不断清空数据防止数据重复出现//4.read  ssize_t read(int fd, void *buf, size_t count);n_read=read(c_fd,readBuf,128);if(n_read == -1){perror("read:");}else{printf("来自服务端的消息:%s\n",readBuf);}}//5.close     int close(int fd);close(c_fd);}return 0;
}

二、往期文章

1、入门Linux系统编程–文件
2、入门Linux系统编程–进程
3、入门Linux系统编程–线程
4、入门Linux系统编程–进程间通信
5、入门Linux系统编程–网络编程

入门Linux系统编程--网络编程相关推荐

  1. 【Linux系统与网络编程】15:Socket文件传输1

    Socket文件传输1 在socket多线程实现多客户端连接服务器进行聊天的基础上,添加文件传输功能. fix1 在server.c中添加file_info结构体,用于单独接受某次客户端发送的file ...

  2. 【Linux系统与网络编程】16:Socket文件传输2

    Socket文件传输2 OVERVIEW Socket文件传输2 在socket文件传输1中使用了一种在buff缓冲数组后添加\0的方式实现文件的传输. 实现方法2:根据TCP在数据传输过程中进行粘包 ...

  3. 基于Linux的socket网络编程项目——游侠手机商城

    基于Linux的socket网络编程项目--游侠手机商城 一.项目说明 二.项目使用的技术 三.客户端搭建 四.服务器端搭建 一.项目说明 本项目是一个仿真手机商城类系统,基本功能: 登录界面功能:用 ...

  4. Linux 高性能服务器网络编程(一)

    Linux 高性能服务器网络编程 Linux网络编程基础API Socket 地址API 通用socket 地址 专用Sokect地址 IP地址转换函数 创建socket(socket) 命名(绑定) ...

  5. linux应用之--网络编程

    linux网络编程 一:网络参考模型参考模型,如下图所示: 二:TCP/IP协议 TCP协议(传输控制协议)和UDP协议(用户数据包协议)是工作在传输层的.  其中TCP协议是面向连接的,UDP是面向 ...

  6. 【Linux】socket网络编程之服务器与客户端的数据交互

    [Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...

  7. Linux系统无线网络抓包程序(分析手机WIFI MAC地址)

    前面讲述了使用tcpdump和wireshark抓WIFI包,但这只是使用工具的层面,再深一层则是自己写代码实现这个功能.本文在前面文章<Linux系统有线网络抓包程序>的基础上添加实现无 ...

  8. Linux系统中网络配置详解

    从linux诞生的那一天起,就注定了它的网络功能空前地强大.所以在linux系统中如何配置网络,使其高效,安全的工作就显得十分重要.下面我们就从网络设备的安装,网络服务的设置和网络安全性三个方面来介绍 ...

  9. 《Linux系统和网络性能监测》读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> <Linux系统和网络性能监测>读书笔记 性能调优是找出系统瓶颈并消除这些瓶颈的过程,很多系统管理员认为性能调优仅 ...

最新文章

  1. 二、配置QtDesigner、PyUIC及PyRcc
  2. c++ lambda基本语法
  3. DC的网络连接端口与防火墙设置[为企业部署Windows Server 2008系列十]
  4. windows下程序开机自启动(任务计划程序)
  5. python教学视频q_#python如何用pyqt5打开视频(还有PPT)并输出到QLabel上?#python怎么运行视屏教程...
  6. 计算机算法设计与分析 数字三角形
  7. 比特币工作量证明,“法外之地”的法
  8. 通俗易懂理解URI和URL的区别
  9. 使用Retrofit和Rxjava实现外卖型二级列表购物车及进入地图显示位置信息
  10. 如何在WPS中加入图表清单(类似生成自动目录)
  11. 遛狗牵绳AI识别实时监测助力智慧城市
  12. PhysX3.4文档(13) -- Spatial Queries
  13. 不懂汇报工作,如何在职场上拼搏
  14. Wincc 编辑颜色对应c脚本返回的十进制数
  15. java鬼吹灯搬山法杖_鬼吹灯昆仑神宫技能搭配攻略之搬山职业篇
  16. BP神经网络实用性操作(四步模板)和主要网络参数介绍
  17. 模糊神经网络matlab模拟仿真
  18. 西安航空学院计算机等级成绩查询,64所院校成绩查询网址
  19. QQ在线小工具箱网页源码+支持强制对话等
  20. 使用pyxlsb库读取xlsb格式excel文件,转为DataFrame(详细)

热门文章

  1. css2.0圆角,CSS圆角效果-CSS3常用属性集合
  2. python+selenium 12306自动抢票
  3. 移动硬盘数据恢复怎么操作?马上学会!
  4. Premiere快速图片旅游照片切换展示AE模板MOGRT
  5. MySQL36-数据库备份与恢复
  6. linux的解压zip文件,linux解压zip文件命令是什么
  7. PPT如何转成PDF格式文档
  8. 知识图谱入门——知识融合
  9. 拂去风尘,回家的风景最美
  10. 兽人物界面显示世界服务器关闭,3月20日维护 世界频道物品显示