linux 下socket编程
原理
- 类unix系统中, 一切皆文件, 诸如磁盘文件, 显卡, 内核驱动, 网络协议栈等
- socket就是linux中提供的用于网络通信的文件接口, 两台机器之间可以读写消息
- 在使用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编程的更多相关文章
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- linux下socket编程
相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...
- [转] - linux下socket编程实例
一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...
- c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...
- linux下socket编程-进程间通信
一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
随机推荐
- PyQt(Python+Qt)学习随笔:QListView的uniformItemSizes属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListView的uniformItemSizes属性用于控制视图中所有项是否具有相同大小,只有在 ...
- scrapy爬虫登录edusrc查看漏洞列表
scrapy登录界面的难点在于登录时候的验证码,我们通过使用scrapy.FormRequest向目标网站提交数据(表单提交),同时将验证码显示在本地,手动输入,进而登录. 验证码是类似于这种的,才可 ...
- "迎圣诞,拿大奖"赛题——SQLI
0x01 本题所需知识清单: 1.php sprintf()函数漏洞:https://blog.csdn.net/WQ_BCJ/article/details/85057447 2.布尔盲注基本pla ...
- 自学linux——22.粘滞位的了解及使用
粘滞位的了解及使用 一.权限 1.文件的权限 r (read) :可读取该文件的实际内容w(write):可以编辑,新增或者修改该文件的内容(但不含删除该文件)x(execute):代表该文件可以被系 ...
- Oracle批量新增数据最佳实践
一.需求描述 现在的项目改造过程中,从国产的Gbase数据库改造为Oracle数据库,遇到一个问题有的业务操作需要批量新增数据. 这也是一个比较常规的操作,有很多地方确实需要一次性新增多条数据.Gba ...
- css外边距重叠及避免方法
<html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...
- sql 遍历list
<select id="findadminSaleList" parameterClass="java.util.Map" resultClass=&qu ...
- vue-cli脚手架搭建vue3.0+typescripe项目
新开个项目,小项目,小.顺手就用vue吧,vue3出来也几个月了,直接上了吧.一年多没用vue了,用的时候也得再熟悉,不如直接干3了! vue官方推荐使用的脚手架是 Vite 和 vue-cli ,延 ...
- 漫谈 HTTP 性能优化
本文主要是侧重于 HTTP 的优化,对于 HTTPS 后续文章会讲. 既然要做性能优化,那么,我们就需要知道:什么是性能?它都有哪些指标,又应该如何度量,进而采取哪些手段去优化? "性能&q ...
- mysqldump备份数据
create database test; use test; create table test(id int,name char(8)); insert into test values(1,'p ...