原理

  1. 类unix系统中, 一切皆文件, 诸如磁盘文件, 显卡, 内核驱动, 网络协议栈等
  2. socket就是linux中提供的用于网络通信的文件接口, 两台机器之间可以读写消息
  3. 在使用socket真正的通信之前, 需要先建立连接, 连接的建立根据协议的不同, 建立的过程也不一样, 目前支持tcp, udp 协议, 通过raw socket, 也可以直接访问网络层的数据包, 更多可参考 http://man7.org/linux/man-pages/man2/socket.2.html

基本使用

功能

基于tcp, 实现一个echo 服务器, 回复客户端后, 直接关闭连接

测试

编译后, 先运行服务端(要有root权限); 用nc或者telnet, 连接监听的端口(示例中使用的是90) , 发送一条消息

示例

#include<stdio.h>   //定义了标准库的文件流操作的函数, 也定义了如printf, perror等
#include<stdlib.h> //定义了很多辅助性的函数, 其中包括exit
#include<unistd.h> //定义了文件操作的函数, 如close
#include<sys/types.h> //定义了一些u_short, u_int, pid_t之类的数据类型, 为了保持和旧系统的兼容性, socket编程非必要, 参见man socket, NOTE段
#include<sys/socket.h> //定义bind, listen, accept等函数
#include<netinet/in.h> //定义了ip地址的结构体
#include<arpa/inet.h> //定义了ip地址转换的函数, 如inet_pton, inet_ntop
#include<errno.h> void err_exit(const char* msg){
int old_errno = errno;
perror(msg);
exit(old_errno);
} int main(void){
//从系统中申请socket句柄, 占用一个进程的文件描述符
int serv_sock_fd = socket(AF_INET, SOCK_STREAM, 0); int on = 1;
// 避免客户端和服务端在同台机器上, 如果先没有正常关闭socket, 导致的address already in use 的错误, 非必须
setsockopt(serv_sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); //定义连接需要的结构体, 里面会声明连接将要使用的协议, 支持AF_INET(ipv4), AF_INET6(ipv6), AF_UNIX(unix域套接字)等
//结构体要置零, 避免未知的错误
struct sockaddr_in serv_addr = {0}; serv_addr.sin_family = AF_INET;
//设置ip地址和端口时, 需要将值转换为网络字节序
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
serv_addr.sin_port = htons(90); //先要将socket和对应的连接协议信息进行绑定
if(bind(serv_sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){
err_exit("socket bind failed");
} //然后开始监听, 协议指定的地址和端口
// listen的第二个参数, 请参考man 2 listen; 暂时设置为5
// listen成功返回之后, 客户端就可以进行连接了
if(listen(serv_sock_fd, 5) < 0){
err_exit("socket listen failed");
} int clnt_sock_fd = -1;
char buffer[1024] = {0};
while(1){
//通过accept调用来获取已连接的客户端; 如果没有连接, 则阻塞,直到有连接进来
clnt_sock_fd = accept(serv_sock_fd, 0, 0);
if (clnt_sock_fd < 0){
err_exit("accept failed");
} //客户端成功连接后, 就可以在socket上, 进行读写(也可以称作发送和接收)了, 可以使用write/read方法, 也可以使用send/recv(请参看man 2 send)
recv(clnt_sock_fd, buffer, sizeof(buffer), 0);
send(clnt_sock_fd, buffer, sizeof(buffer), 0); //完成响应后, 直接关闭客户端的连接
close(clnt_sock_fd);
}
}

linux 下socket编程的更多相关文章

  1. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  2. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  3. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  4. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  5. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  6. [转] - linux下socket编程实例

    一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...

  7. c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...

  8. linux下socket编程-进程间通信

    一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...

  9. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

随机推荐

  1. C++编程指南(6-7)

    六.函数设计 函数是C++/C程序的基本功能单元,其重要性不言而喻.函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的.本章重点论述函数的接口设计和内部实现的一些规则. 函数接口 ...

  2. 深入浅出让你理解什么是LLVM

    什么是LLVM 转载自https://www.jianshu.com/p/1367dad95445 LLVM项目是模块化.可重用的编译器以及工具链技术的集合. 美国计算机协会 (ACM) 将其2012 ...

  3. 性能测试学习之路 (二)jmeter详解(jmeter执行顺序 && 作用域 && 断言 && 事务 &&集合点 )

    1 Jmeter 工作区介绍 jmeter工作区分为3个部分:目录树.测试计划编辑区域.菜单栏. 2 Jmeter 执行顺序规则 Jmeter执行顺序规则如下: 配置元件 前置处理器 定时器 采样器s ...

  4. bugkuctf web区 多次

    首先看到以下url : 发现这是一个基于布尔类型的盲注. true: false: 根据这两种类型可以进行注入.废话不多说,直接进行尝试. 构造 url = index.php?id=1' or 1= ...

  5. Jquery返回顶部插件

    自己jquery开发的返回顶部,当时只为了自己用一下,为了方便,修改成了插件... 自己的博客现在用的也是这个插件..使用方便!! <!DOCTYPE html> <html> ...

  6. jquery和zepto有何区别?

    1.针对移动端程序,Zepto有一些基本的触摸事件可以用来做触摸屏交互(tap事件.swipe事件),Zepto是不支持IE浏览器的. 2.DOM操作的区别:添加id时jQuery不会生效而Zepto ...

  7. 落谷 P1412 经营与开发

    题目链接 Solution 用传统的思想考虑正推,发现后面的答案依赖于当前的 \(p\),你不但要记录前 \(i\) 个还要记录 \(p\),显然空间爆炸. 类似 AcWing 300. 任务安排1, ...

  8. sort by背后使用了什么排序算法

    用到了快速排序,但不仅仅只用了快速排序,还结合了插入排序和堆排序 搬运自https://blog.csdn.net/qq_35440678/article/details/80147601

  9. STL—— 容器(vector)的数据插入之 insert()

    vector 容器可以使用 vectorName.insert() 方法插入元素,vectorName.insert() 函数一共有4种重载方法: 第一种 insert() 用法:在指定地址插入单个元 ...

  10. Jmeter +Maven+jenkins+eclipse 接口自动化测试

    背景: 首先用jmeter录制或者书写性能测试的脚本,用maven添加相关依赖,把性能测试的代码提交到github,在jenkins配置git下载性能测试的代码,配置运行脚本和测试报告,配置运行失败自 ...