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 ...
随机推荐
- Oracle表操作-创建及增删改查
数据类型: 1.CHAR:定长字符类型,默认长度是1,最长不超过2000字节. 2.CARCHAR2(length):可变字符类型,默认长度是1,最长不超过4000字符. 3.NUMBER(P,S): ...
- Web前端-按钮点击效果(水波纹)
这种效果可以由元素内嵌套canves实现,也可以由css3实现. Canves实现 网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下 第一种方法: html骨架 ...
- Codeforces Edu Round 53 A-D
A. Diverse Substring 找普遍性(特殊解即可). 最简单的便是存在一个区间\([i, i + 1] (1 <= i < n)\),且$str[i] $ $ != str[ ...
- gnuplot图例legend设置
//将图例放在右下角 set key bottom //将图例放在中间 set key center //将图例放在左边 set key left //将图例放在指定位置右下角的坐标为(10,0.7) ...
- CET4词汇
abandon vt.丢弃:放弃,抛弃 ability n.能力:能耐,本领 abnormal a.不正常的:变态的 aboard ad.在船(车)上:上船 abroad ad.(在)国外:到处 ab ...
- webpack入门级 - 从0开始搭建单页项目配置
前言 webpack 作为前端最知名的打包工具,能够把散落的模块打包成一个完整的应用,大多数的知名框架 cli 都是基于 webpack 来编写.这些 cli 为使用者预设好各种处理配置,使用多了就会 ...
- strin 字符串的内置函数
count("x")统计字符串的元素的个数 a = "hello kitty" print (a.count("t"))#统计t出现的个数 ...
- [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何
题意:给一条平面内$n$个点的折线,要求在折线上搞一个高度$h$的瞭望塔,能够看见折线上所有的点,求$h$的最小值($n \leq 300$) updata2018.1.21 正解半平面交在另一篇里面 ...
- DRF类视图让你的代码DRY起来
刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don't Repeat Yourself)设计原则: 使 ...
- layui的基本使用
打开官网https://www.layui.com/下载这个框架 官网首页 下载到 layui 的最新版,它经过了自动化构建,更适合用于生产环境.目录结构如下 ├─css //css目录 │ │─mo ...