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

  • 相关阅读:
    AC日记——Little Elephant and Numbers codeforces 221b
    AC日记——Little Elephant and Function codeforces 221a
    AC日记——Mice and Holes codeforces 797f
    AC日记——Sliding Window poj 2823
    Poj 2976 Dropping tests(01分数规划 牛顿迭代)
    Bzoj 1968: [Ahoi2005]COMMON 约数研究
    洛谷 P2424 约数和
    Hdu Can you find it?(二分答案)
    SPOJ GSS1
    Bzoj 2243: [SDOI2011]染色(树链剖分+线段树)
  • 原文地址:https://www.cnblogs.com/asif/p/3611585.html
Copyright © 2020-2023  润新知