linux下的socket编程(3)--server端的简单示例

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\n" );
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\n" );
exit( 1 );
}
printf( "bind success\n" );
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;
 
//创建socket
sock_desc = socket(AF_INET,SOCK_STREAM, 0 );
if (- 1 ==sock_desc)
{
perror( "cannot create socket\n" );
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\n" );
exit( 1 );
}
 
//监听
 
listen(sock_desc, 5 );
 
puts( "waiting for incoming connecting \n" );
 
//接受链接
 
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_socket
close(new_socket);
//z在关闭sock_desc
close(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);

转载于:https://www.cnblogs.com/yjds/p/8597340.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值