说明开发运行环境:OS X Yosemite 10.10.4
其他平台没有做测试,如果在其他 Linux 平台的话,可以使用 man
检查对应函数所需要的头文件,引入即可,不然的话,会出现编译错误。
Client
操作步骤:
- 创建一个
socket
实例,使用socket
函数创建 - 使用
IP
地址链接服务器,使用connect
函数 - 向服务器发送数据,使用
write
,从服务器接收数据,使用read
开发的时候主要需要引入 socket.h
这个头文件,一般头文件存放在 /usr/include/sys/
这个目录中,首先检查下这个文件是否存在,不然的话在开发中会出现错误。
socket
支持 TCP
和 UDP
协议,在使用 socket
函数创建的时候,可以指定协议。
在绑定地址的时候,需要将字符串转换为网络地址,这就需要用到 inet_addr
函数,引入头文件 arpa/inet.h
。
下面我们将写个示例展示下 Client
端的开发步骤
示例 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
int main(void)
{
// 第三个参数可以指定协议 `TCP` `UDP`
int skt = socket(PF_INET, SOCK_STREAM, 0);
if (!skt) {
printf("create error\n");
return 1;
}
struct sockaddr_in address;
address.sin_family = PF_INET;
address.sin_port = htons(8888);
address.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(skt, (struct sockaddr *) &address, sizeof(address)) < 0) {
printf("connect error\n");
close(skt);
return 1;
}
char str[200] = "hello socket";
int n = write(skt, str ,strlen(str));
if (n < 0) {
printf("send error\n");
close(skt);
return 1;
}
n = read(skt, str, 200);
if (n > 0) {
printf("%s\n", str);
} else {
printf("read error\n");
close(skt);
return 1;
}
close(skt);
return 0;
}
Server
- 创建一个
socket
实例,使用socket
函数创建 - 绑定到一个端口,使用
bind
进行绑定 - 监听端口,使用
listen
- 接收客户端请求,使用
accept
- 处理客户端请求,使用
write
和read
示例 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
int main()
{
int skt = socket(PF_INET, SOCK_STREAM, 0);
if (!skt) {
printf("create error\n");
return 1;
}
struct sockaddr_in address;
address.sin_family = PF_INET;
address.sin_port = htons(8888);
address.sin_addr.s_addr = INADDR_ANY; // 监听任意地址,也可以用 inet_addr("127.0.0.1") 设置监听地址
int ret = bind(skt, (const struct sockaddr *) & address, sizeof(address));
ret = listen(skt, 2);
printf("服务器开启....\n");
struct sockaddr_in client_address;
socklen_t len;
int newsocket;
char recive_data[256];
while (1) {
// 循环监听
newsocket = accept(skt, (struct sockaddr *) &client_address, &len);
printf("客户端%d链接到服务器\n", newsocket);
recv(newsocket, recive_data, sizeof(recive_data), 0);
printf("%s\n", recive_data);
write(newsocket, recive_data, sizeof(recive_data));
}
close(newsocket);
close(skt);
return 0;
}
使用
1 | // 编译 |
结果:
server 窗口1
2
3
4> ./serve
服务器开启....
客户端4链接到服务器
hello socket
client 窗口1
2> ./client
hello socket
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
End