1.select搭建客户端
4 #include <head.h>
5 #define IP "192.168.122.147"
6 #define PORT 1024
7 int main(int argc, const char *argv[])
8 {
9 int cfd = socket(AF_INET,SOCK_STREAM,0);
10 if(cfd < 0)
11 {
12 ERR_MSG("socket");
13 return -1;
14 }
15
16 int reuse = 1;
17 if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
18 {
19 ERR_MSG("setsockopt");
20 return -1;
21 }
22
23 struct sockaddr_in sin;
24 sin.sin_family = AF_INET;
25 sin.sin_port = htons(PORT);
26 sin.sin_addr.s_addr = inet_addr(IP);
27
28 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
29 {
30 ERR_MSG("connect");
31 return -1;
32 }
33 printf("[%s : %d] cfd = %d 服务器连接成功\n",\
34 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
35
36 int s_res = -1;
37 char buf[128] = "";
38 ssize_t res = 0;
39
40 fd_set readfds,tempfds;
41 FD_ZERO(&readfds);
42 FD_ZERO(&tempfds);
43 FD_SET(cfd,&readfds);
44 FD_SET(0,&readfds);
45
46
47 while(1)
48 {
49 tempfds = readfds;
50 s_res = select(cfd+1,&tempfds,NULL,NULL,NULL);
51 if(s_res < 0)
52 {
53 ERR_MSG("select");
54 return -1;
55 }
56 else if(s_res == 0)
57 {
58 printf("time out");
59 break;
60 }
61 if(FD_ISSET(0,&tempfds))
62 {
63 printf("向服务器发送数据\n");
64 bzero(buf,sizeof(buf));
65 scanf("%d %s",cfd,buf);
66 while(getchar()!=10);
67 if(send(cfd,buf,sizeof(buf),0) < 0)
68 {
69 ERR_MSG("send");
70 return -1;
71 }
72 }
73 else if(FD_ISSET(cfd,&tempfds))
74 {
75 printf("从服务器接收数据\n");
76
77 bzero(buf,sizeof(buf));
78 res = recv(cfd,buf,sizeof(buf),0);
79 if(res < 0)
80 {
81 ERR_MSG("recv");
82 return -1;
83 }
84 else if(res == 0)
85 {
86 printf("[%s : %d] cfd=%d 服务器断开连接\n",\
87 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
88 FD_CLR(cfd,&readfds);
89 break;
90 }
91 printf("[%s : %d] cfd=%d %s\n",\
92 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd,buf);
93 }
94 }
95
96 close(cfd);
97 return 0;
98 }
~
2.poll客户端
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <head.h>
5 #define IP "192.168.122.147"
6 #define PORT 1024
7 int main(int argc, const char *argv[])
8 {
9 int cfd = socket(AF_INET,SOCK_STREAM,0);
10 if(cfd < 0)
11 {
12 ERR_MSG("socket");
13 return -1;
14 }
15
16 int reuse = 1;
17 if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
18 {
19 ERR_MSG("setsockopt");
20 return -1;
21 }
22
23 struct sockaddr_in sin;
24 sin.sin_family = AF_INET;
25 sin.sin_port = htons(PORT);
26 sin.sin_addr.s_addr = inet_addr(IP);
27
28 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
29 {
30 ERR_MSG("connect");
31 return -1;
32 }
33 printf("[%s : %d] cfd = %d 服务器连接成功\n",\
34 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
35
36 int p_res = -1;
37 char buf[128] = "";
38 ssize_t res = 0;
39
40 struct pollfd fds[2];
41 fds[0].fd = 0;
42 fds[0].events = POLLIN;
43 fds[1].fd = cfd;
44 fds[1].events = POLLIN;
45
46 while(1)
47 {
48 p_res = poll(fds,2,-1);
49 if(p_res < 0)
50 {
51 ERR_MSG("select");
52 return -1;
53 }
54 else if(p_res == 0)
55 {
56 printf("time out");
57 break;
58 }
59 if((fds[0].revents & POLLIN) != 0)
60 {
61 printf("向服务器发送数据\n");
62 bzero(buf,sizeof(buf));
63 scanf("%s",buf);
64 while(getchar()!=10);
65 if(send(cfd,buf,sizeof(buf),0) < 0)
66 {
67 ERR_MSG("send");
68 return -1;
69 }
70 }
71 else if((fds[1].revents & POLLIN) != 0)
72 {
73 printf("从服务器接收数据\n");
74
75 bzero(buf,sizeof(buf));
76 res = recv(cfd,buf,sizeof(buf),0);
77 if(res < 0)
78 {
79 ERR_MSG("recv");
80 return -1;
81 }
82 else if(res == 0)
83 {
84 printf("[%s : %d] cfd=%d 服务器断开连接\n",\
85 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
86
87 break;
88 }
89 printf("[%s : %d] cfd=%d %s\n",\
90 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd,buf);
91 }
92 }
93
94 close(cfd);
95 return 0;
96 }
3.项目上传代码
int sc(int sfd,struct sockaddr_in sin)
157 {
158 char name[20] = "";
159 printf("请输入要上传文件名\n");
160 scanf("%s",name);
161 while(getchar() != 10);
162 char buf[516];
163 unsigned short *p1 = (unsigned short*)buf;
164 *p1 = htons(2);
165 char *p2 = buf+2;
166 strcpy(p2,name);
167 char *p3 = p2+strlen(p2)+1;
168 strcpy(p3,"octet");
169 int len = sizeof(unsigned short)+strlen(p2)+1+strlen(p3)+1;
170
171 if(sendto(sfd,buf,len,0,\
172 (struct sockaddr*)&sin,sizeof(sin)) < 0)
173 {
174 ERR_MSG("send");
175 return -1;
176 }
177 printf("发送成功\n");
178 struct sockaddr_in cin;
179 socklen_t addrlen2 = sizeof(cin);
180 unsigned short i = 0;
181 ssize_t res = 0;
182 int fd = -1;
183 while(1)
184 {
185 bzero(buf,sizeof(buf));
186 if(recvfrom(sfd,buf,sizeof(buf),0,\
187 (struct sockaddr*)&cin,&addrlen2) < 0)
188 {
189 ERR_MSG("recvfrom");
190 return -1;
191 }
192
193 unsigned short *pb1 = (unsigned short*)buf;
194 unsigned short *pb2 = pb1+1;
195 if(*pb1 == htons(4) && i == ntohs(*pb2))
196 {
197 char *pp = buf+4;
198
199 if(-1 == fd)
200 {
201 fd = open(name,O_RDONLY);
202 if(fd < 0)
203 {
204 ERR_MSG("open");
205 return -1;
206 }
207 }
208
209 res = read(fd,pp,sizeof(buf)-4);
210 if(res < 0)
211 {
212 ERR_MSG("write");
213 close(fd);
214 break;
215 }
216 printf("上传成功\n");
217 short *pa1 = (short*)buf;
218 *pa1 = htons(3);
219 short *pa2 = (short*)buf+1;
220 *pa2 = htons(++i);
221 if(sendto(sfd,buf,res+4,0,\
222 (struct sockaddr*)&cin,addrlen2) < 0)
223 {
224 ERR_MSG("recvfrom");
225 close(fd);
226 break;
227 }
228 if(res < 512)
229 {
230 printf("上传完成\n");
231 close(fd);
232 break;
233 }
234 }
235 else if(*pb1 == htons(5))
236 {
237 short *pc1 = pb1+1;
238 char *pc2 = (char*)pb1+4;
239 printf("%d %s\n",ntohs(*pc1),pc2);
240 break;
241 }
242 }
243 close(sfd);
244 return 0;
245 }
4.xmind