说明开发运行环境: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.c1
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.c1
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
 
        