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”,服务器会显示客户端发来的内容,并发回客户端,客户端会显示自己刚刚发过去的内容。客户端退出之后,服务器会显示退出信息,并且显示当前的登陆用户数量

posted on 2014-03-19 15:44  asif  阅读(473)  评论(0编辑  收藏  举报

导航