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 <signal.h>
11 #include <stdlib.h>
12 #include <sys/wait.h>
13 #include <pthread.h>
14 void* zi(void *hh);
15 void* fu(void* dd);
16 typedef struct qq
17 {
18 int newsfd;
19 struct sockaddr_in cin;
20 }pp;
21 void hh()
22 {
23 pid_t res;
24 while(1)
25 {
26 res=waitpid(-1,NULL,0);
27 if(res<0)
28 {
29 break;
30 }
31
32 }
33 return;
34
35 }
36 void* zi(void *hh)
37 {
38 struct qq *jj=(struct qq*)hh;
39 int newsfd=jj->newsfd;
40 struct sockaddr_in cin=jj->cin;
41 printf("客户端上线[%s %d]>>\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
42 while(1)
43 {
44 char pop[128];
45 ssize_t res;
46 char pp[128];
47 bzero(pop,sizeof(pop));
48 res=recv(*((int*)hh),pop,sizeof(pop),0);
49 if(res<0)
50 {
51 printf("接受是失败\n");
52 break;
53 }
54 else if(res==0)
55 {
56 printf("客户端下线[%s %d ]>\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
57 break;
58
59 }
60 if(strcmp(pop,"quit")==0)
61 {
62 break;
63 }
64 printf("%s\n",pop);
65 char h[128]="******";
66 char b[128]="******";
67 strcat(h,pop);
68 strcat(h,b);
69 send(jj->newsfd,h,sizeof(h),0);
70 }
71 close(*((int*)hh));
72 return NULL;
73 }
74 int main(int argc, const char *argv[])
75 {
76 __sighandler_t pp=signal(17, hh);
77 //创建套接字socket
78 int sfd= socket(AF_INET , SOCK_STREAM,0);
79 if(sfd<0)
80 {
81 printf("套接字失败\n");
82 return -1;
83 }
84 printf("套接字创建成功\n");
85 int reuse = 1;
86 if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
87 {
88 fprintf(stderr, "line:%d ", __LINE__);
89 perror("setsockopt");
90 return -1;
91
92 }
93 struct sockaddr_in hh;
94 hh.sin_family = AF_INET;
95 hh.sin_port = htons(PP);
96 hh.sin_addr.s_addr=inet_addr(IP);
97 if(bind(sfd,(struct sockaddr *)&hh,sizeof(hh))<0)
98 {
99 printf("绑定失败\n");
100 return -1;
101 }
102
103 //绑定服务器ip bind
104 if(listen(sfd,128)<0)
105 {
106 printf("监听失败\n");
107 return -1;
108 }
109 struct qq ci;
110 while(1)
111 {
112 struct sockaddr_in uu;
113 socklen_t len=sizeof(uu);
114 int newsfd=accept(sfd,(struct sockaddr*)&uu,&len);
115 if(newsfd<0)
116 {
117 printf("失败\n");
118 break;
119 }
120 ci.newsfd=newsfd;
121 ci.cin=uu;
122 pthread_t kkk;
123 int ji=pthread_create(&kkk,NULL,&zi,(void*)&ci);
124 pthread_detach(kkk);
125 }
126 close(sfd);
127 //获取链接的套接字accept
128 //接受客户端信息
129 //发送客户端信息
130 return 0;
131 }
运行效果
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include <netinet/ip.h>
7 #include <string.h>
8 #include <sys/socket.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include <string.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <fcntl.h>
15 #include <unistd.h>
16 int do_shang(int pf,struct sockaddr_in fa );
17 #define POSR 69
18 #define IP "192.168.124.30"
19 int do_down(int pf,struct sockaddr_in fa ) ;
20 int main(int argc, const char *argv[])
21 {
22 int pf= socket(AF_INET,SOCK_DGRAM ,0);
23 if(pf<0)
24 {
25 printf("套接字失败\n");
26 return -1;
27 }
28 printf("套接字成工\n");
29 struct sockaddr_in fa;
30 fa.sin_family=AF_INET;
31 fa.sin_port=htons(POSR);
32 fa.sin_addr.s_addr=inet_addr(IP);
33 char buf[128]="";
34 socklen_t oo=sizeof(fa);
35 while(1)
36 {
37 int a=0;
38 int temp;
39 printf("--------------------\n");
40 printf("-------2上传--------\n");
41 printf("-------1下载--------\n");
42 printf("-------3退出--------\n");
43 printf("请输入你的选择>>");
44 scanf("%d",&temp);
45 while(getchar()!='\n');
46 switch(temp)
47 {
48 case 1:
49 do_down(pf,fa);
50 break;
51 case 2:
52 do_shang(pf,fa);
53 break;
54 case 3:
55 a=1;
56 break;
57
58 }
59 if(a==1)
60 {
61 break;
62
63 }
64 }
65
66 return 0;
67 }
68 int do_down(int pf,struct sockaddr_in fa )
69 {
70 char name[28];
71 fprintf(stderr,"请输入文件名>>");
72 scanf("%s",name);
73 getchar();
74 //打包请求
75 //-----------请求包---------------//
76 char fabao[516]="";
77 short* r=(short*)fabao;
78 //读的形式,下载
79 *r=htons(1);
80 char * name1=(char*)(r+1);
81 strcpy(name1,name);
82 //模式
83 char* mode=name1+strlen(name1)+1;
84 strcpy(mode,"octet");//数据打包完成
85 //-------------------------------//
86 //------------数据包-------------//
87 char data[516];
88 //------------------------------//
89 int res=2+sizeof(name1)+1+sizeof(mode)+1;
90
91 if(sendto(pf,fabao,res,0,(struct sockaddr*)&fa,sizeof(fa))<0)
92 {
93 printf("发送失败\n");
94 return -1;
95 }
96
97 int fp=open(name, O_RDWR | O_CREAT | O_TRUNC ,0777);
98 struct sockaddr_in temp;
99 char linshi[516];
100 socklen_t len=sizeof(temp);
101 //--------应答包----------------//
102 char huia[4];
103 short *hh=(short*)huia;
104 *hh=htons(4);
105 short* qw=hh+1;
106 *qw=*((short*)(data+2));
107 //-----------------------------//
108 int count=0;
109 while(1)
110 {
111 bzero(data,sizeof(data));
112 short*io=(short*)huia;
113 ssize_t res=recvfrom(pf, data, sizeof(data), 0,(struct sockaddr *)&temp,&len);
114 char *kl=data+4;
115 ssize_t re=write(fp,kl,res-4);
116 short* qw=io+1;
117 *qw=*((short*)(data+2));
118
119 sendto(pf,huia,sizeof(huia),0,(struct sockaddr*)&temp,sizeof(temp));
120 if(res<516)
121 {
122 printf("退出\n");
123 break;
124
125 }
126 }
127 }
128 int do_shang(int pf,struct sockaddr_in fa )
129 {
130 struct sockaddr_in fa1=fa;
131 char name[28];
132 fprintf(stderr,"请输入文件名>>");
133 scanf("%s",name);
134 getchar();
135 //打包请求
136 //-----------请求包---------------//
137 char fabao[516]="";
138 short* r=(short*)fabao;
139 //读的形式,下载
140 *r=htons(2);
141 char * name1=(char*)(r+1);
142 strcpy(name1,name);
143 char* mode=name1+strlen(name1)+1;
144
145 strcpy(mode,"octet");
146 //----------数据包------------//
147 char date[516];
148 short *ui=(short*)date;
149 //-----------------------------//
150 int ppf=open(name,O_RDONLY);
151 if(ppf<0)
152 {
153 printf("文件打开失败\n");
154 return -1;
155 }
156 int i=0;
157 //------------确认包-------------//
158 char qu[4]="";
159 //------------端口信息-----------//
160 socklen_t len=sizeof(fa1);
161 //-------------------------------//
162 //------------发送信息----------//
163 int res=2+sizeof(name1)+1+sizeof(mode)+1;
164 sendto(pf,fabao,res,0,(struct sockaddr*)&fa,sizeof(fa));
165 recvfrom(pf,qu,sizeof(qu),0,(struct sockaddr* )&fa1,&len);
166
167 while(1)
168 {
169
170 *ui=htons(3);
171 short*mok=ui+1;
172 *mok=htons(i);
173 //----数据打包-------//
174 ssize_t res=read(ppf,date+4,512);
175 printf("接受的快编码;%d\n",ntohs(*((short*)(qu))));
176 printf("接受的快编码;%d\n",ntohs(*((short*)(qu+2))));
177 sendto(pf,date,res+4,0,(struct sockaddr*)&fa1,sizeof(fa1));
178 if(res<512)
179 {
180 break;
181
182
183 }
184 recvfrom(pf,qu,sizeof(qu),0,(struct sockaddr* )&fa1,&len);
185 //-------教研ack--------//
186 if(ntohs(*((short*)(qu+2)))!=i)
187 {
188 printf("发错\n");
189 }
190 i++;
191
192 }
193
194
195 }
运行效果上传;
下载