C & Socket

说明开发运行环境:OS X Yosemite 10.10.4
其他平台没有做测试,如果在其他 Linux 平台的话,可以使用 man 检查对应函数所需要的头文件,引入即可,不然的话,会出现编译错误。

Client

操作步骤:

  1. 创建一个 socket 实例,使用 socket 函数创建
  2. 使用 IP 地址链接服务器,使用 connect 函数
  3. 向服务器发送数据,使用 write,从服务器接收数据,使用 read

开发的时候主要需要引入 socket.h 这个头文件,一般头文件存放在 /usr/include/sys/ 这个目录中,首先检查下这个文件是否存在,不然的话在开发中会出现错误。

socket 支持 TCPUDP 协议,在使用 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
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

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

  1. 创建一个 socket 实例,使用 socket 函数创建
  2. 绑定到一个端口,使用 bind 进行绑定
  3. 监听端口,使用 listen
  4. 接收客户端请求,使用 accept
  5. 处理客户端请求,使用 writeread

示例 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
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

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
2
3
4
5
6
7
8
9
// 编译
gcc -o server server.c
gcc -o client client.c

// 在一个终端窗口运行
./server

// 在另外一个终端窗口运行
./client

结果:
server 窗口

1
2
3
4
> ./serve     
服务器开启....
客户端4链接到服务器
hello socket

client 窗口

1
2
> ./client
hello socket

©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息

End

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay