• socket


    写个C语言的Socket博文,运行效果如下:

    实现步骤:

    1. Server端

     1 #include <stdio.h>                   //用于printf等函数的调用
     2 #include <winsock2.h>                //Socket的函数调用 
     3 #pragma comment (lib, "ws2_32")      //C语言引用其他类库时,除了.h文件外,还要加入对应的lib文件(这个不同于C#)
     4 int main()
     5 {
     6     WSADATA wsaData;
     7     WSAStartup(MAKEWORD(2, 2), &wsaData);
     8 
     9     SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    10 
    11     sockaddr_in sockaddr;
    12     sockaddr.sin_family=PF_INET;
    13     sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");   //需要绑定到本地的哪个IP地址
    14     sockaddr.sin_port=htons(9000);                          //需要监听的端口
    15     bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));        //进行绑定动作
    16 
    17     listen(s, 1);                                           //启动监听
    18 
    19     printf("listening on port [%d].
    ", 9000);
    20 
    21     while(TRUE)
    22     {
    23         SOCKADDR clientAddr;
    24         int size=sizeof(SOCKADDR);
    25 
    26         SOCKET clientsocket;
    27         clientsocket=accept(s, &clientAddr, &size);               //阻塞,直到有新tcp客户端连接
    28         printf("***SYS***    New client touched.
    ");
    29 
    30         char* msg="Hello, my client.
    ";
    31         send(clientsocket, msg, strlen(msg)+sizeof(char), NULL);  //这里的第三个参数要注意,是加了一个char长度的
    32         printf("***SYS***    HELLO.
    ");
    33 
    34         while(TRUE)
    35         {
    36             char buffer[MAXBYTE]={0};
    37             recv(clientsocket, buffer, MAXBYTE, NULL);            //一直接收客户端socket的send操作
    38             printf("***Client***    %s
    ", buffer);
    39         }
    40 
    41         closesocket(clientsocket);                                //关闭socket
    42     }
    43 
    44     closesocket(s);                           //关闭监听socket
    45     
    46     WSACleanup();                                                //卸载
    47 
    48     getchar();                                                   
    49 
    50     exit(0);
    51 }

    由于还在学习中,因此没有实现多线程,因此客户端实际上只能1个,其他的会被挡在外面

    关于socket的缓冲区还有点学问,比如最后要 结尾等,都是有原因的,建议看看资料。

    2. Client端

     1 int main()
     2 {
     3     Sleep(2000);                        //沉睡2秒再连接server
     4 
     5     WSADATA wsaData;
     6     WSAStartup(MAKEWORD(2, 2), &wsaData);
     7 
     8     SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
     9 
    10     sockaddr_in sockaddr;
    11     sockaddr.sin_family=PF_INET;
    12     sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    13     sockaddr.sin_port=htons(9000);
    14 
    15     connect(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));
    16 
    17     char buffer[MAXBYTE]={0};
    18     recv(s, buffer, MAXBYTE, NULL);
    19     printf("***SERVER***%s", buffer);
    20 
    21     while(TRUE)
    22     {
    23         char* mymsg=new char[100000];
    24         printf("You can chat with server now:
    ");
    25         gets(mymsg);
    26         send(s, mymsg, strlen(mymsg)+sizeof(char), NULL);
    27         /*
    28            recv函数中的bufferlength参数是可以固定值的
    29            send函数中的bufferlength参数不能固定值,需要看实际长度,并且考虑到''字符串
    30         */
    31     }
    32 
    33     closesocket(s);
    34 
    35     WSACleanup();
    36 
    37     getchar();
    38 
    39     exit(0);
    40 }
  • 相关阅读:
    教你三招打入App Store推荐目录!
    APP下载量低 如何显著提高APP下载量?
    导致APP排名下跌的主要因素
    如何提高APP关键词覆盖率?先熟悉套路!
    如何让你的ASO优化效果提升10倍?
    有效的移动应用推广策略
    APP运营推广不得不看的6种数据指标
    如何为你的APP选出“最好”的关键词
    手机应用开发宝典:如何养成一款畅销APP
    Linux下设置定期执行脚本
  • 原文地址:https://www.cnblogs.com/Y-HKL/p/5478119.html
Copyright © 2020-2023  润新知