zoukankan      html  css  js  c++  java
  • 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
    ",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]='';
    32                 printf("recv %s: %s
    ",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
    ",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”,服务器会显示客户端发来的内容,并发回客户端,客户端会显示自己刚刚发过去的内容。客户端退出之后,服务器会显示退出信息,并且显示当前的登陆用户数量

  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/asif/p/3611585.html
Copyright © 2011-2022 走看看