学习吴哥的linux编程基础教程中,在socket通信基础的示例代码实现的过程中出现了一些小问题,服务端程序能够运行正常,但是客户端程序总是连接不上,最后发现原因是 没有正确填写本机的ip地址,第二次尝试时把htons写成了htonl,编译器也没有报错,这里记录下来。

关于socket通信过程总结,
服务端socket通信:
1.创建服务端的socket
2.把服务端用于通信的地址和端口绑定到socket撒花姑娘
3.把socket设置为监听模式
4.接受客户端的连接
5.与客户端通信,接受客户端发过来的报文后,回复处理结果
6.不断重复5,知道客户端断开连接
7.关闭socket,释放资源

客户端socket通信
1.创建客户端的socket
2.与服务器发起连接请求
3.与服务端通信,发送一个报文后等待回复,然后发送下一个报文
4.不断重复3,知道所有的数据发送完
5.关闭socket,释放资源

函数小结
服务端函数调用的流程是:socket->bind->listen->accept->recv/send->close

客户端函数调用的流程是:socket->connect->send/recv->close

其中send/recv可以进行多次交互。

服务端代码

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>int main()
{//第一步:创建服务端的socketint listenfd = socket(AF_INET,SOCK_STREAM,0);//第二部:把服务端用于通信的地址和端口绑定到socket上struct sockaddr_in servaddr;//服务端地址信息的数据结构memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;//协议簇,在socket编程中只能是AF_INET//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//任意ip地址servaddr.sin_addr.s_addr = inet_addr("192.168.193.128");//指定主机ip地址servaddr.sin_port = htons(5000);//指定通信端口if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))!=0){perror("bind");close(listenfd);return -1;}//第三步:把socket设置为监听模式if(listen(listenfd,5)!=0){perror("listen");close(listenfd);return -1;}//第四步:接受客户端连接int clientfd;//客户端的socketint socklen=sizeof(struct sockaddr_in);//struct sockaddr_in 的大小struct sockaddr_in clientaddr;//客户端的地址信息clientfd= accept(listenfd,(struct sockaddr*)&clientaddr,(socklen_t*)&socklen);printf("客户端(%s)已经连接。\n",inet_ntoa(clientaddr.sin_addr));//第五步:与客户端通信,接受客户端发过来的报文后恢复okchar buffer[1024];while(1){memset(buffer,0,sizeof(buffer));if(recv(clientfd,buffer,sizeof(buffer),0)<=0)break;//接收客户端的请求报文。printf("接收:%s\n",buffer);strcpy(buffer,"ok");if(send(clientfd,buffer,strlen(buffer),0)<=0)break;//向客户端发送响应结果printf("发送:%s\n",buffer);}//第六步:关闭socket,释放资源close(listenfd);close(clientfd);
}

客户端代码


#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>int main()
{//第一步:创建客户端socketint sockfd = socket(AF_INET,SOCK_STREAM,0);//第二步:向服务器发送连接请求struct hostent* h;if((h = gethostbyname("192.168.193.128  "))==0)//指定服务端ip地址{perror("gethostbyname");close(sockfd);return -1;}struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(5000);//指定服务端的通信端口memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))!=0)//向服务端发起连接请求{perror("connect");close(sockfd);return -1;}char buffer[1024];//第3步:与服务端通信,附送一个报文后等待回复,然后再发下一个报文、for(int ii=0;ii<3;ii++){memset(buffer,0,sizeof(buffer));sprintf(buffer,"这是第%d个超级女生,编号%03d.",ii+1,ii+1);if(send(sockfd,buffer,strlen(buffer),0)<=0)break;//向服务端发送请求报文。printf("发送:%s\n",buffer);memset(buffer,0,sizeof(buffer));if(recv(sockfd,buffer,sizeof(buffer),0)<=0)break;//接收服务端返回的结果printf("接收:%s\n",buffer);}//第四步:关闭socket,释放资源close(sockfd);
}

学习笔记:linuxsocket通信基础相关推荐

  1. 转载学习笔记:c++atoi

    c++中的atoi()和stoi()函数的用法和区别 鸡啄米的时光机 2018-08-27 20:58:41 28304 收藏 28 最后发布:2018-08-27 20:58:41首发:2018-0 ...

  2. WCF服务编程 学习笔记(1)

    你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...

  3. 计算机网络-学习笔记

    计算机网络-学习笔记 1.1.1 概念.组成.功能和分类 概念:计算机网络:是一个将分散的.具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统.计算机网 ...

  4. 计算机网络学习笔记(详尽版)

    计算机网络学习笔记 计算机网络 第一章 定义和特点 网络 定义 功能 特点 组成 类别 性能 结构 本章重要概念 第二章 物理层 基本概念和标准 数据通信基础知识 物理层下的传输媒体 引导型传输媒体 ...

  5. 凸优化学习笔记:QP及SOCP问题

    凸优化学习笔记:QP及SOCP问题 QP问题 定义 是什么 几何意义 QP.QCQP.LP之间的关系 例子 最小二乘及回归问题 多面体间距离 方差定界问题 基于随机费用的线性规划(考虑随机变量的优化问 ...

  6. 计算机网络学习笔记之物理层

    计算机网络学习笔记之物理层 通信基础 背景知识 基本概念 数据.信号与码元 信源.信道与信宿 速率.波特与带宽 ★ \bigstar ★ 奈奎斯特定理(奈式准则)与香农定理 ★ \bigstar ★ ...

  7. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  8. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  10. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

最新文章

  1. 一天学完spark的Scala基础语法教程十三、文件IO操作(idea版本)
  2. RMAN SET NEWNAME
  3. linux磁盘分区fdisk命令详解
  4. SHOI2016 黑暗前的幻想乡
  5. java volatile实例_Java的Volatile实例用法及讲解
  6. 爬虫笔记八——Scrapy实战项目
  7. LA_4670_Dominating_Patterns_(AC自动机+map)
  8. 为什么选择spark
  9. SQL Cumulative Sum累积求和
  10. Atitit 诗歌之道 attilax著 艾龙 著 1. 诗歌集分类 1 1.1. 国王颂歌 1 1.2. 爱情类(相逢 赞美 相识 思念 离去 分分离离 忘记) 1 1.3. 其他 1 2. 世界
  11. 后端MultipartFile接收文件转Base64
  12. 【 PID 算法 】PID 算法基础
  13. html如何调图片透明度,改变图片的透明度.html
  14. CentOS7--安装谷歌浏览器--详细步骤
  15. 优化动画卡顿:卡顿原因分析及优化方案
  16. html实现从内向外渐变色,CSS3 由内到外(放射性)渐变
  17. 什么的出现标志着电子计算机的到来,20世纪四五十年代以来,人类在原子能、计算机、航天技术、电力机械等方面取得了重大突破,标志着新的科学技术革命的到来。——青夏教育精英家教网——...
  18. 《音视频开发》系列-总览
  19. Getaverse,走向 Web3 的远方桥梁
  20. unity画一条流动的弧线(贝塞尔线)

热门文章

  1. uvalive5990(坑点蛮多的一道题。。)
  2. Express框架Restful API Ajax 跨域 开启Cookie支持
  3. hystrix源码小贴士之Yammer Publisher
  4. js callback promise async await 几种异步函数处理方式
  5. [转]常用OCR软件介绍
  6. Android 网络请求HttpURLConnection 和 HttpClient详解
  7. 此microsoft fix it不适用于您的操作系统 解决方案
  8. url中参数以及callback后面的串
  9. linux系统中安装和使用rz/sz命令详解
  10. MyEclipse的安装和汉化过程