linux下的socket编程(3)
server端的简单示例:
经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上去。
绑定socket到一个端口上去
bind()函数可以将socket绑定一个端口上,client可以通过这个端口发起请求,端口对应的socket便会与client端的socket连接。
|
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
|
#include<stdio.h>#include<stdllib.h>#include<sys/socket.h>#include<sys/types.h>#Include<arpa/inet.h>int main(){int socket_desc;struct sockaddr_in server;socket_desc = socket(AF_INET,SOCK_STREAM,0);if(-1==socket_desc){perror("socket create error
");exit(1);}//监听服务器自身server.sin_family=AF_INET;server.sin_port = htons(8888);server.sin_addr.s_addr = INADDR_ANY;//绑定到端口if(bind(socket_desc,(struct sockaddr* )&server,sizeof(server))<0){perror("bind failed
");exit(1);}printf("bind success
");close(socket_desc);return 0;} |
对于socket绑定到一个明确的端口上,我们接下来要做的就是接受这个端口下面的所有数据。。
通过上面的实现,我们可以看出一个端口只能被一个socket使用。
监听端口:
在绑定完成socket与端口之后,我们还需要去监听端口。为此,我们需要将socket设置在被监听的状态。listen()将被用来将socket设置为被监听的模式下。
listen( socket_desc, 3);
listen(int sockfd,int backlog);可以将socket处于监听的状态下
接收请求建立连接:
|
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
47
48
49
50
51
52
|
#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<arpa/inet.h>int main(){int sock_desc,new_socket,sockaddr_size;struct sockaddr_in server,client;//创建socketsock_desc = socket(AF_INET,SOCK_STREAM,0);if(-1==sock_desc){perror("cannot create socket
");exit(1);}server.sin_family = AF_INET;server.sin_port = htons(8888);server.sin_addr.s_addr = INADDR_ANY;//绑定if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))<)){perror("bind error
");exit(1);}//监听listen(sock_desc,5);puts("waiting for incoming connecting
");//接受链接sockadddr_size = sizeof(sruct sockaddr_in );new_socket = accept(sock_desc,(struct sockaddr *)&client,(socklen_t * )&sockaddr_size);if(new_socket<0){perror("accept failed");exit(1);}puts("connecting accept ");//先关闭socket_desc 产生的new_socketclose(new_socket);//z在关闭sock_descclose(sock_desc);return 0;} |
运行上述代码:输出:waiting for incoming connecions.
现在代码已经正常跑起来了,并且等待请求连接。在另外一个终端内,我们发起一个请求:
teltnet 127.0.0.1 8888
在当前这个终端内将会输出:
trying 127.0.0.1
connected to loaclhost。
Escape character is ;;
connection closed by foreign host
同时在之前的终端中,server会输出:
waiting for incoming connecions.
connection accepted
便可以看到,server已经正确接收了client的连接请求并建立了连接,只是没有了后续操作,主机紧接着关闭了这个链接。
连接建立之后便可以顺利地进行双方的通信,这部分的send与recv操作完全一样。
另外, 服务端获取客户端的ip地址:
由前面能够知道accept()返回的是结构体sockaddr_in ,由此很容易得知client的ip和端口信息。
|
1
2
|
char * client_ip = inet_ntoa(client.sin_addr);int client_port = ntohs(client.sin_port); |