服务器设置为接受所有ip地址的请求,不同ip地址可以同一时间访问服务器。服务器通过fork,让每一个连接的客户端对应一个子进程为客户端服务,在客户端下线时有服务器父进程循环回收死去的子进程。
服务器:
1 #include<stdlib.h>
2 #include<sys/socket.h>
3 #include<stdio.h>
4 #include<arpa/inet.h>
5 #include<unistd.h>
6 #include<strings.h>//bzero
7 #include<fcntl.h>
8 #include<wait.h>
9 #include<signal.h>
10 #define server_port 8888
11 void wait_child(int arg)
12 {
13 while((waitpid(0,NULL,WNOHANG))>0);
14 }
15 void main(void)
16 {
17 pid_t pid;
18 char buf[BUFSIZ];
19 char i_ntop[BUFSIZ];
20 int n,i;
21 int server_sock,clien_sock;
22 server_sock=socket(AF_INET,SOCK_STREAM,0);
23 struct sockaddr_in clien_sockaddr;
24 struct sockaddr_in server_sockaddr;
25 socklen_t clien_sock_len=sizeof(clien_sockaddr);
26 bzero(&server_sockaddr,sizeof(server_sockaddr));
27 server_sockaddr.sin_family=AF_INET;
28 server_sockaddr.sin_port=htons(server_port);
29 server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
30 bind(server_sock,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr));
31 listen(server_sock,128);
32 while(1){
33 clien_sock=accept(server_sock,(struct sockaddr *)&clien_sockaddr,&clien_sock_len);
34 pid=fork();
35 if(pid==0){
36 close(server_sock);
37 break;
38 }
39 if(pid>0){
40 close(clien_sock);
41 signal(SIGCHLD,wait_child);
42 }
43 }if(pid==0){
44 while(1){
45 n=read(clien_sock,buf,sizeof(buf));
46 if(n==0){
47 close(clien_sock);
48 exit(0);
49 }else if(n<0){
50 perror("read error");
51 exit(1);
52 }else{
53 printf("clien_ip=%s--clien_port=%d\n",inet_ntop(AF_INET,&clien_sockadd r.sin_addr.s_addr,i_ntop,sizeof(i_ntop)),ntohs(clien_sockaddr.sin_port));
54 printf("%s\n",buf);
55 }
56 }
57 }
58 }
客户端:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<arpa/inet.h>
4 #include<sys/socket.h>
5 #include<strings.h>
6 #include<string.h>
7
8 #define clien_addr "127.0.0.1"
9 #define clien_port 8888
10 void main(void)
11 {
12 //建立套接字
13 int clien_sock;
14 clien_sock=socket(AF_INET,SOCK_STREAM,0);
15 //设置sockaddr_in结构体
16
17 struct sockaddr_in clien_sockaddr;
18 bzero(&clien_sockaddr,sizeof(clien_sockaddr));
19 clien_sockaddr.sin_family=AF_INET;
20 clien_sockaddr.sin_port=htons(clien_port);
21 // clien_sockaddr.sin_addr.s_addr=inet_addr(clien_addr);
22 inet_pton(AF_INET,clien_addr,&clien_sockaddr.sin_addr.s_addr);
23 //绑定套接字与网络ip,端口号
24 bind(clien_sock,(struct sockaddr *)&clien_sockaddr,sizeof(clien_sockaddr));
25 //发送连接请求
26 connect(clien_sock,(struct sockaddr *)&clien_sockaddr,sizeof(clien_sockaddr));
27 //向服务器输入数据
28 while(1){
29 char buf[1024];
30 fgets(buf,sizeof(buf),stdin);
31 write(clien_sock,buf,strlen(buf));
32 }
33 }