首页 > 其他 > 详细

创建一个简单的echo服务器

时间:2020-08-11 00:20:35      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:recv   src   同名   bre   转换   pan   

本文设置一个简单的Echo服务器。端口用宏来起一个:40000。

服务器的七大阶段:socket,bind,listen,accept,recv,send,close。服务器使用此7个同名函数来进行连接,监听,读写,关闭等动作。如下为man配置的API函数信息。

需要额外注意bind和accept的相应成员变量的强制类型转换。

1.socket

技术分享图片

 

2.bind

技术分享图片

 

 

3.listen

 技术分享图片

4.accept

 技术分享图片

5.recv

 技术分享图片

6.send

 技术分享图片

7.close

技术分享图片

 

此外,我还用了setsocketopt来额外设置socket选项,

附加1.setsockopt

 技术分享图片

 

附加2.sockaddr_in结构体成员(使用  :!man 7 ip  命令查看)

技术分享图片

  

 

 

如下为代码:

 1 //Author:kunshanpipixia
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 #include <pthread.h>
 6 #include <unistd.h>
 7 #include <errno.h>
 8 #include <sys/socket.h>
 9 #include <arpa/inet.h>
10 #include <ctype.h>
11 #define PORT 40000
12 #define MESSAGE_LEN 1024
13 int main(int argc, char* argv[])
14 {
15     int socket_fd,accept_fd;
16     int on=1;
17     struct sockaddr_in localaddr,remoteaddr;
18     int ret=-1;
19     int backlog=10;
20     socket_fd=socket(AF_INET,SOCK_STREAM,0);
21     char in_buff[MESSAGE_LEN]={0,};
22     if(socket_fd==-1)
23     {
24         printf("Failed");
25         exit(-1);
26     }
27     ret=setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
28     if(ret==-1)
29     {
30         printf("Failed to set socket options");
31     }
32     localaddr.sin_family=AF_INET;
33     localaddr.sin_port=PORT;
34     localaddr.sin_addr.s_addr=INADDR_ANY; 
35     bzero(&(localaddr.sin_zero),8);
36     ret=bind(socket_fd,(struct sockaddr *)&localaddr,sizeof(struct sockaddr));
37     if(ret==-1)
38     {
39         printf("Failed to bind");
40         exit(-1);
41     }
42     ret=listen(socket_fd,backlog);
43     if(ret==-1)
44     {
45         printf("failed to listen");
46         exit(-1);
47     }
48     for(;;)
49     {
50         socklen_t addr_len=sizeof(struct sockaddr);
51         accept_fd=accept(socket_fd,(struct sockaddr *)&remoteaddr,&addr_len);
52           
53     }
54     for(;;)
55     {
56         ret=recv(accept_fd,(void*)in_buff,MESSAGE_LEN,0);
57         if(ret==0)
58         {
59             break;
60         }
61         printf("%x",in_buff);
62         send(accept_fd,(void*)in_buff,MESSAGE_LEN,0);
63     }
64     close(accept_fd);
65 close(socket_fd);
66 return 0;
67 }

编译运行。得到结果如下图,证明该服务器正在监听。

 技术分享图片

 

创建一个简单的echo服务器

标签:recv   src   同名   bre   转换   pan   

原文:https://www.cnblogs.com/kunshanpipixia/p/13473103.html

(0)
(0)
   
举报
评论 一句话评论(0
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号