Linux下简单socket编程

socket的英文翻译是接口、插座的意思,很形象,就相当于将两个台电脑用一根线连起来,线的两头分别是插头,插在两台电脑上,借此实现通信。

两台电脑通信,实际上是这两台电脑上的某个进程在进行通信。而两个进程进行通信,实际上是往同一个文件中读取数据。

在理解socket编程之前,先大概了解一下socket缓冲区的概念

socket编程基于传输层,是应用层和传输层之间的一个抽象层。在使用socket API时,实际上每创建一个socket,都会分配两个缓冲区,输入缓冲区和输出缓冲区(大小一般是8K),Linux下一切皆文件的思想,两台主机在进行通信时,write函数是向缓冲区里写,read函数是从缓冲区里读,至于缓冲区里的数据什么时候被传输,有没有达到目标主机,这些都交给传输层的TCP/UDP来做。

但在Windows中,将socket文件和普通文件分开,所以不能用write函数和read函数实现,而是用send函数和recv函数。

每次通信都打开了一个socket文件,所以通信结束后,在进程关闭前,要关闭所有的socket文件。

三次握手、四次挥手

socket的API是在三次握手和四次挥手的基础上设置的接口

接口中用到的结构体(如:sockaddr、sockaddr_in),初学照猫画虎即可,不用深究。

总的来说,不管是struct sockaddr还是**struct sockaddr_in **都是存放了一个ip地址,一个端口号,和ip的类型(IPV4还是IPV6)

注意:

  • 每次输入的ip要通过inet_addr(“127.0.0.1”)函数转化,将一个点分十进制ip转换成长无符号整形,头文件在<arpa/inet.h>中

  • 端口号要转换成小端,具体操作及原因在网络字节序有详细介绍。

下图是三次握手的流程图:

一个客户端只有一个sock(文件描述符),而一个服务器最少有两个(一个是自己创建socket时的sock,剩下的是每有一个客户端连接服务器就生成一个sock文件描述符)。

在数据传输过程中,即相当于文件的读写操作:

四次挥手在socket API上的接口表示为关闭各自拥有的文件描述符即可。

Linux下TCP的socket通信:

实现了一次客户端向服务器发送数据和一次服务器向客户端响应的通信。

/*serve_tcp.c*/
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>int main(){//创建套接字int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//初始化socket元素struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(1234);//绑定文件描述符和服务器的ip和端口号bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));//进入监听状态,等待用户发起请求listen(serv_sock, 20);//接受客户端请求//定义客户端的套接字,这里返回一个新的套接字,后面通信时,就用这个clnt_sock进行通信struct sockaddr_in clnt_addr;socklen_t clnt_addr_size = sizeof(clnt_addr);int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);//接收客户端数据,并相应char str[256];read(clnt_sock, str, sizeof(str));printf("client send: %s\n",str);strcat(str, "+ACK");write(clnt_sock, str, sizeof(str));//关闭套接字close(clnt_sock);close(serv_sock);return 0;
}
/*client_tcp.c*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>int main(){//创建套接字int sock = socket(AF_INET, SOCK_STREAM, 0);//服务器的ip为本地,端口号1234struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(1234);//向服务器发送连接请求connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));//发送并接收数据char buffer[40];printf("Please write:");scanf("%s", buffer);write(sock, buffer, sizeof(buffer));read(sock, buffer, sizeof(buffer) - 1);printf("Serve send: %s\n", buffer);//断开连接close(sock);return 0;
}

注意:应先运行服务器端,再运行客户端。

Linux下简单socket编程相关推荐

  1. Linux下的socket编程学习(TCP)

    1.什么是socket? socket的英文翻译就是接口,插座的意思,很形象,就相当于将2台电脑用一根线连起来,线的两头插在不同的电脑上,借此实现通讯的功能. 两台电脑通信,实际上是这两台电脑上的某个 ...

  2. Linux下网络socket编程——实现服务器(select)与多个客户端通信

    一.关于socket通信 服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定 调用listen()函数监听socket() 函数创建的 ...

  3. linux下的socket编程

    1.socket的通信流程 这是socket的通信流程图. 在linux系统中,一切皆文件,socket也被看作是文件. 所以socket的通信可以看作是往socket文件中写入数据和读取数据的过程. ...

  4. Linux下C++ Socket编程实例

    参考文章: https://www.cnblogs.com/wuyepeng/p/9737583.html

  5. Linux下TCP网络编程-创建服务器与客户端

    一.前言 互联网概念诞生于20世纪60年代末,从9几年中国接入互联网开始到现在,生活的每个角落都能看到网络的使用.现在物联网时代.共享经济的到来,生活中不仅仅电脑.手机可以接入网络,身边的各个设备也能 ...

  6. linux C语言 socket编程教程(附两个例子)(socket教程)

    文章目录 1.网络中进程之间如何通信? 2.什么是Socket? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 网络字节序与主机字节序 3.3.listen(). ...

  7. Linux下高级C编程(学习总结)

    Linux下高级C编程 第一章 unix/linux系统的基本概念 第二章 unix/linux系统下的编程基础和开发方式 第三章 unix/linux系统下的内存管理 第四章 unix/linux系 ...

  8. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  9. Linux下的C编程实战(转载)

    http://www.cnblogs.com/alexusli/archive/2008/10/24/1318736.html Linux下的C编程实战(转载) (转自)http://www.cnbl ...

最新文章

  1. 关于学习Python的一点学习总结(43->类中的方法重写)
  2. eclipse设置和启动优化(转)
  3. js设计模式-组合模式
  4. ASP.NET 2.0主题和皮肤实现网站美化
  5. python def函数报错详解_Python函数详解
  6. 关于技术管理者应该如何做好工作安排的一点思考
  7. mvn 修改所有子项目pom版本
  8. python enumeration_python枚举防止无效的属性分配
  9. TortoiseGit使用技巧
  10. linux定时任务crontab的设置
  11. flutter 微信语言选择_flutter实战项目,教你使用flutter打造微信app页面!
  12. AngularJs 实战 -慕课网
  13. linux最小化连接开放wifi,CentOS最小化安装后启用无线连接网络
  14. 卸载已有的navicat for mysql,安装破解版navicat for mysql
  15. 它不是哆啦A梦 也能满足你的挑剔需求
  16. [架构之路-177]-《软考-系统分析师》-17-嵌入式系统分析与设计 -2- 系统分析与设计、低功耗设计
  17. 使用metasploit破解ssh密码
  18. 国内外日常上网必备,实用趣味网站合集
  19. 很多应用程序运行时会出现“若要运行此应用程序,您必须首先安装.NET Framework的以下版本之一”的解决方法
  20. 网上特工网络监控系统 v5.65 官网

热门文章

  1. 耻辱之日显示没有服务器,耻辱之日配置要求介绍 最低配置是什么
  2. allure简介与使用
  3. xcode请求日志在哪里看_iOS日志获取和实时浏览器显示日志
  4. Ext.grid.ColumnModel如何获取其他列的值
  5. 重磅干货 |《2018腾讯移动游戏技术评审标准与实践案例》正式发布,开放下载
  6. 【TensorFlow】freeze_graph
  7. 大象高端营销:装饰公司如何创造活动亮点
  8. jEdit打字区域背景颜色个性化设置
  9. 最新kali之kismet
  10. ModbusTCP报文