Linux下TCP/IP协议的Socket编程
server.c
1 # include<stdio.h> 2 # include<arpa/inet.h> 3 # include<stdlib.h> 4 # include<unistd.h> 5 # include<sys/socket.h> 6 # include<sys/mman.h> 7 int main(int argc, const char *argv[]) 8 { 9 int sfd=socket(AF_INET,SOCK_STREAM,0),cfd,n,*count; //count记录登陆的用户数量 10 count=(int *)mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); //开辟一个共享内存空间,把地址返回给count 11 *count=0; 12 struct sockaddr_in s,c; 13 char buf[128]; 14 socklen_t len; 15 s.sin_family=AF_INET; //后三行初始化一个socket地址。inet_addr 将字符串强制转化ip地址,htons将整数转化为网络可识别的 16 s.sin_addr.s_addr=inet_addr(argv[1]); 17 s.sin_port=htons(atoi(argv[2])); 18 bind(sfd,(struct sockaddr *)&s,sizeof(s)); //绑定服务器接口 19 listen(sfd,5); //打开监听 20 while(1) 21 { 22 puts("Waitting..............."); 23 len=sizeof(c); 24 cfd=accept(sfd,(struct sockaddr *)&c,&len); //接收来自客户端的连接 25 printf("%s login, now user is %d\n",inet_ntoa(c.sin_addr),++(*count)); //inet_ntoa将ip地址转化为字符串 26 while(fork()==0) //开辟多进程 27 { 28 close(sfd); 29 while((n=recv(cfd,buf,sizeof(buf),0))!=0) //接收客户端发来的数据再发回去 30 { 31 buf[n]='\0'; 32 printf("recv %s: %s\n",inet_ntoa(c.sin_addr),buf); 33 send(cfd,buf,n,0); 34 } 35 close(cfd); //关闭cfd 36 printf("%s logout, now user is %d\n",inet_ntoa(c.sin_addr),--(*count)); 37 exit(0); 38 } 39 close(cfd); 40 } 41 return 0; 42 }
client.c
1 # include<stdio.h> 2 # include<stdlib.h> 3 # include<unistd.h> 4 # include<sys/socket.h> 5 # include<arpa/inet.h> 6 # include<string.h> 7 int main(int argc, const char *argv[]) 8 { 9 int cfd=socket(AF_INET,SOCK_STREAM,0); //建立一个套接字 10 struct sockaddr_in s; 11 char buf[128]; 12 s.sin_family=AF_INET; //初始化一个socket 13 s.sin_port=htons(atoi(argv[2])); 14 s.sin_addr.s_addr=inet_addr(argv[1]); 15 connect(cfd,(struct sockaddr *)&s,sizeof(s)); //连接服务器 16 while(1) 17 { 18 gets(buf); 19 send(cfd,buf,strlen(buf),0); //向服务器发送数据 20 recv(cfd,buf,sizeof(buf),0); //从服务器接收数据 21 puts(buf); 22 } 23 close(cfd); 24 return 0; 25 }
然后开始编译:
gcc server.c -o server -Wall
gcc client.c -o client -Wall
之后会得到一个名为server和一个名为client可执行文件。
然后先执行server,再执行client如下图
client登陆之后服务器可以看到谁连接了它,并且显示当前连接的用户数量
连接之后我向服务器发送一个“hello”,服务器会显示客户端发来的内容,并发回客户端,客户端会显示自己刚刚发过去的内容。客户端退出之后,服务器会显示退出信息,并且显示当前的登陆用户数量