1 #include<stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <arpa/inet.h>
5 #include <netinet/in.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <sys/un.h>
9 //#include<sys/socket.h>
10
11 //打印错误新的宏函数
12 #define ERR_MSG(msg) do{\
13 fprintf(stderr, " __%d__ ", __LINE__);\
14 perror(msg);\
15 }while(0)
16
17 int main(int argc, const char *argv[])
18 {
19 //创建流式套接字
20 int sfd=socket(AF_INET,SOCK_STREAM,0);
21 if(sfd<0)
22 {
23 ERR_MSG("socket");
24 return -1;
25 }
26 //快速重置端口
27 int reuse=1;
28 if(setsockopt(sfd,IPPIOTO-IP,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
29 {
30 ERR_MSG("setsockopt");
31 return -1;
32 }
33 //绑定服务器
34 struct sockaddr_in sin;
35 sin.sin_family=AF_INET;
36 sin.sin_port=htons(8888);
37 sin.sin_addr.s_addr=inet.addr(192.168.31.147);
38 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
39 {
40 ERR_MSG("bind");
41 return -1;
42 }
43 //化为监听系统
44 if(listen(sfd,10)<0)//监听系统包含队列次数
45 {
46 ERR_MSG("listen")
47 return -1;
48 }
49 //创建新的文件描述结构体,接收来自客户端信息地址
50 struct sockaddr_in cin;
51 int newfd;
52 socket_t len =sizeof(cin);
53 while(1)
54 {
55 //生成新的文件描述符
56 if((newfd=accept(sfd,(struct sockaddr*)&cin,&len))<0)
57 {
58 ERR_MSG("accept");
59 return -1;
60 }
61 while(1){
62 char buf[128]="";
63
64 bzero(buf,sizeof(buf));
65 if(int res=recvfrom(newfd,buf,sizeof(buf),0,NULL,NULL)<0)
66 {
67 ERR_MSG("recvfrom");
68 return -1;
69 }
70 else if(0==res){
71 printf("[%s:%d]newfd=%d,客户端退出\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
72 break;
73 }
74 strcat(buf,"*_*");//将获取到的客户端发来的信息追加*发出
75 if(send(newfd,buf,sizeof(buf),0)<0)
76 {
77 ERR_MSG("send");
78 return -1;
79 }
80
81 }
82 close(newfd);//收发结束关闭文件描述符
83 }
84 close(sfd);
85 return 0;
86 }
tcp循环式服务器
最新推荐文章于 2023-10-09 20:51:52 发布