kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

文件socket

http://blog.csdn.net/y_23k_bug/article/details/9993555

1. 建立socket

1
2
3
4
5
6
7
8
9
10
#include<sys/socket.h>

int socket(
	int domain,      //地址族的类型AF_UNIX (绑定在本地) AF_INET(绑定在网卡)
	int type,      //支持的数据格式:流SOCK_STREAM/报文SOCK_DGRAM
	int protocol); //支持的协议,建议为0

返回值:
	成功返回文件描述符号。
	失败返回-1;

2.绑定在地址上(文件目录地址)URL(Universe ResourceLocation)

1
2
3
4
协议://路径/文件名
file:///usr/bin/ls      普通文件
http://192.168.0.72/index.php
struct sockaddr;  地址结构体
1
2
3
4
5
6
7
8
#include<linux/un.h>

struct sockaddr_un;   un=unix(绑定unix本地)

struct sockaddr_un {
	sa_family_t   sun_family; /*AF_UNIX*/
	char sun_path[UNIX_PATH_MAX];
};
1
2
3
4
5
6
7
8
struct sockaddr_in;   in=internet(绑定网卡)
int bind(int fd,           //socket描述符号
	struct sockaddr *addr, //绑定地址
	socklen_tsize);        //地址长度

返回值:
	0成功
	-1失败

样例

server.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<linux/un.h>
 
int main()
{
	int fd; 
	int r;
	char buf[100];
	//1.建立socket
	fd = socket(AF_UNIX, SOCK_DGRAM, 0);  //AF_FILE 等同//AF_UNIX
	if (fd == -1) {
		printf("socket error:%m\n");
		exit(-1);
	}   
 
	//2.构造本地文件地址
	struct sockaddr_un addr = {0};
	addr.sun_family = AF_UNIX; //必须跟socket的地址族一致
	memcpy(addr.sun_path, "my.sock", strlen("my.sock"));
	
	//3.把socket绑定在地址上
	r = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
	if (r == -1) {
		printf("bind error:%m\n");
		exit(-1);
	}   
 
	//4.接收数据
	bzero(buf , sizeof(buf));
	r = read(fd, buf, sizeof(buf));
	buf[r] = 0;
	printf("%s\n", buf);
 
	//5.关闭
	close(fd);
 
	//6.删除socket文件
	unlink("my.sock");
 
	//socket文件不会自动删除,需要在程序结尾去删除该文件,否则,再次运行//A程序出错
	return 0;
}
client.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<linux/un.h>
#include<string.h>
#include<unistd.h>
 
int main()
{
	int fd; 
	int r;
	struct sockaddr_un addr = {0};
	//1.建立socket
	fd = socket(AF_UNIX, SOCK_DGRAM, 0); 
 
	//2.连接到指定的地址
	addr.sun_family = AF_UNIX;
	memcpy(addr.sun_path, "my.sock", strlen("my.sock"));
	r = connect(fd, (struct sockaddr*)&addr, sizeof(addr));
 
	//3.发送数据
	write(fd, "hello!", strlen("hello!"));
 
	//4.关闭
	close(fd);
	return 0;
}

kernel, net

« ubuntu安装systemtap Linux 中的零拷贝技术 »