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 #define PP 8888
9 #define IP "192.168.124.10"
10 #include <sys/time.h>
11 #include <sys/types.h>
12 #include <unistd.h>
13 #include <sys/select.h>
14 int kehu(int sfd,struct sockaddr_in xinxi[],fd_set *readfes,int *max);
15 int jp(struct sockaddr_in xinxi[],fd_set readfes);
16 void shuju(int i,struct sockaddr_in *xinxi,int *max,fd_set *readfes);
17 int main(int argc, const char *argv[])
18 {
19 //创建套接字socket
20 int sfd= socket(AF_INET , SOCK_STREAM,0);
21 if(sfd<0)
22 {
23 printf("套接字失败\n");
24 return -1;
25 }
26 printf("套接字创建成功\n");
27 int reuse = 1;
28 if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
29 {
30 fprintf(stderr, "line:%d ", __LINE__);
31 perror("setsockopt");
32 return -1;
33
34 }
35 struct sockaddr_in hh;
36 hh.sin_family = AF_INET;
37 hh.sin_port = htons(PP);
38 hh.sin_addr.s_addr=inet_addr(IP);
39 if(bind(sfd,(struct sockaddr *)&hh,sizeof(hh))<0)
40 {
41 printf("绑定失败\n");
42 return -1;
43 }
44
45 //绑定服务器ip bind
46 if(listen(sfd,128)<0)
47 {
48 printf("监听失败\n");
49 return -1;
50 }
51 struct sockaddr_in uu;
52 struct sockaddr_in xinxi[1024];
53 socklen_t len=sizeof(uu);
54
55 //-----------------创建集合--------------//
56 int nfds=sfd+1;
57 fd_set readfes,temp;
58 FD_ZERO(&readfes);//清空集合
59 //---------------加入集合----------------//
60 FD_SET(sfd, &readfes);
61 FD_SET(0, &readfes);
62 char pop[128];
63 ssize_t res;
64 char pp[128];
65 int max=sfd;
66 int newsfd=1234567;
67 while(1)
68 {
69 temp=readfes;
70
71 int rr=select(max+1,&temp,NULL,NULL,NULL);
72 if(rr<0)
73 {
74 printf("等待失败\n");
75 return -1;
76 }
77 for(int i=0;i<=max;i++)
78 {
79 if(FD_ISSET(i,&temp)==0)
80 continue;
81 if(i==0)
82 {
83 jp(xinxi,readfes);
84
85
86 }
87 else if(i==sfd)
88 {
89 kehu(sfd,xinxi,&readfes,&max);
90 }
91 else
92 {
93 shuju(i,xinxi,&max,&readfes);
94 }
95 }
96
97 }
98 //获取链接的套接字accept
99 //接受客户端信息
100 //发送客户端信息
101 return 0;
102 }
103 /*
104 * function: 键盘事件
105 * @param [ in]
106 * @param [out]
107 * @return
108 */
109 int jp(struct sockaddr_in xinxi[],fd_set readfes)
110 {
111 int ffp;
112 char buf[128];
113 ssize_t res=scanf("%d %s",&ffp,buf);
114 while(getchar()!='\n');
115 if(res!=2)
116 {
117 printf("输入有误请重新输入\n");
118 return -1;
119
120 }
121 if(FD_ISSET(ffp,&readfes)!=1)
122 {
123 printf("文件描述符不对\n");
124 return -1;
125
126 }
127 send(ffp,buf,sizeof(buf),0);
128 printf("客户端[%s %d nfd=%d]发送成功\n",inet_ntoa(xinxi[ffp-3].sin_addr),htons(xinxi[ffp-3].sin_port),ffp);
129 return 0;
130 }
131 /*
132 * function: 客户端事件
133 * @param [ in]
134 * @param [out]
135 * @return
136 */
137 int kehu(int sfd,struct sockaddr_in xinxi[],fd_set *readfes,int *max)
138 {
139 struct sockaddr_in uu;
140 socklen_t len =sizeof(uu);
141 int newsfd=accept(sfd,(struct sockaddr*)&uu,&len);
142 if(newsfd<0)
143 {
144 printf("失败\n");
145 return -1;
146 }
147 xinxi[newsfd-3]=uu;
148 printf("客户端[%s %d]上线 nfd=%d\n",inet_ntoa(xinxi[newsfd-3].sin_addr),htons(xinxi[newsfd-3].sin_port),newsfd);
149
150 FD_SET(newsfd,readfes);
151 *max=newsfd>(*max) ? newsfd:*max;
152 return -1;
153
154 }
155 /*
156 * function: 数据段
157 * @param [ in]
158 * @param [out]
159 * @return
160 */
161 void shuju(int i,struct sockaddr_in *xinxi,int *max,fd_set *readfes)
162 {
163
164 char bf[128];
165 bzero(bf,sizeof(bf));
166 ssize_t fanhui=recv(i,bf,sizeof(bf),0);
167 if(fanhui==0)
168 {
169 printf("客户端[%s %d]下线 nfd=%d\n",inet_ntoa(xinxi[i-3].sin_addr),htons(xinxi[i-3].sin_port),i);
170 close(i);
171 FD_CLR(i,readfes);
172 for(;*max>0;*max--)
173 {
174 if(FD_ISSET(*max,readfes))
175 {
176 break;
177 }
178 }
179 return ;
180 }
181
182 printf("客户端[%s %d] nfd=%d >>%s\n",inet_ntoa(xinxi[i-3].sin_addr),htons(xinxi[i-3].sin_port),i,bf);
183 char kk[]="-----";
184 strcat(bf,kk);
185 send(i,bf,sizeof(bf),0);
186 return ;
187 }
~
~
客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#define PP 8888
#define IP "192.168.124.10"
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/select.h>
#define _GNU_SOURCE
#include <signal.h>
#include <poll.h>
int main(int argc, const char *argv[])
{
//创建套接字socket
int sfd= socket(AF_INET , SOCK_STREAM,0);
if(sfd<0)
{
printf("套接字失败\n");
return -1;
}
printf("套接字创建成功\n");
struct sockaddr_in hh;
hh.sin_family = AF_INET;
hh.sin_port = htons(PP);
hh.sin_addr.s_addr=inet_addr(IP);
socklen_t len=sizeof(hh);
if(connect(sfd,(struct sockaddr *)&hh,len)<0)
{
printf("链接失败\n");
return -1;
}
printf("%d\n",sfd);
//----创建监听集合-----//
struct pollfd pol[2];
pol[0].fd=0;
pol[0].events=POLLIN;
pol[1].fd=sfd;
pol[1].events=POLLIN;
char buf[128];
int res;
while(1)
{
res=poll(pol, 2,-1);
if(res<0)
{
printf("监听失败\n");
return -1;
}
//说明有键盘事件触发//
if((pol[0].revents&POLLIN)!=0)
{
bzero(buf,sizeof(buf));
scanf("%s",buf);
send(sfd,buf,sizeof(buf),0);
}
if((pol[1].revents&POLLIN)!=0)
{
bzero(buf,sizeof(buf));
ssize_t res;
res=recv(sfd,buf,sizeof(buf),0);
if(res==0)
{
printf("服务器下线\n");
}
printf("%s\n",buf);
}
}
//发送客户端信息
return 0;
}
运行效果