Linux Socket 编程实例(一个Echo程序)

本文编的是echo服务器示例程序,当收到客户端的数据,服务器把数据不经加工地发送给客户。采用TCP连接,采用端口8080进行设计,在整个过程中主要涉及socket的通信。

1. [代码]echo_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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <netdb.h>
#include <sys/socket.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
 
#define EHCO_PORT    8080
#define MAX_CLIENT_NUM        10
 
int main()
{
     int socketfd;
     socketfd = socket(AF_INET, SOCK_STREAM, 0);
        
     if (socketfd == -1)
     {
         printf ( "errno=%d " , errno );
         exit (1);
     }
     else
     {
         printf ( "socket create successfully " );
     }
 
     struct sockaddr_in sa;
     bzero(&sa, sizeof (sa));
     sa.sin_family = AF_INET;
     sa.sin_port = htons(EHCO_PORT);
     sa.sin_addr.s_addr = htons(INADDR_ANY);
     bzero(&(sa.sin_zero), 8);
 
     if (bind(socketfd, ( struct sockaddr *)&sa, sizeof (sa))!= 0)
     {
         printf ( "bind failed " );
         printf ( "errno=%d " , errno );
         exit (1);
     }
     else
     {
         printf ( "bind successfully " );
     }
 
     //listen
     if (listen(socketfd ,MAX_CLIENT_NUM) != 0)
     {
         printf ( "listen error " );
         exit (1);
     }
     else
     {
         printf ( "listen successfully " );
     }
 
     int clientfd;
     struct sockaddr_in clientAdd;
     char buff[101];
     socklen_t len = sizeof (clientAdd);
     int closing =0;
     while ( closing == 0  && (clientfd = accept(socketfd, ( struct sockaddr *)&clientAdd, &len)) >0 )
     {
         int n;
         while ((n = recv(clientfd,buff, 100,0 )) > 0)
         {
             printf ( "number of receive bytes = %d " , n);
             write(STDOUT_FILENO, buff, n);
             send(clientfd, buff, n, 0);
             buff[n] = '' ;
             if ( strcmp (buff, "quit " ) == 0)
             {
                 break ;
             }
             else if ( strcmp (buff, "close " ) == 0)
             {
                 //server closing
                 closing = 1;
                 printf ( "server is closing " );
                 break ;
             }
         }
 
         close(clientfd);
     }
 
     close(socketfd);
 
     return 0;
}

2. [代码]测试方法     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
linyongting@linyongting:~$ telnet 192.168.0.69 8080
Trying 192.168.0.69...
Connected to 192.168.0.69.
Escape character is '^]' .
hello! This is my first packet.Can you reply to me?
hello! This is my first packet.Can you reply to me?
Ohh, U did it!
Ohh, U did it!
see U next time !!!
see U next time !!!
quit
quit
Connection closed by foreign host.
linyongting@linyongting:~$ telnet 192.168.0.69 8080
Trying 192.168.0.69...
Connected to 192.168.0.69.
Escape character is '^]' .
close
close
Connection closed by foreign host.

3. [代码]服务器运行日志     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
linyongting@linyongting:~ /program/c $ . /echoServer
socket create successfully
bind successfully
listen successfully
// 第一次通信
number of receive bytes = 53
hello! This is my first packet.Can you reply to me?
number of receive bytes = 16
Ohh, U did it!
number of receive bytes = 20
see U next time !!!
number of receive bytes = 6
quit
// 第二次通信
number of receive bytes = 7
close
server is closing

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值