文件socket
2015-04-29 17:32:00
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;
}