本文设置一个简单的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 }
编译运行。得到结果如下图,证明该服务器正在监听。
原文:https://www.cnblogs.com/kunshanpipixia/p/13473103.html