zoukankan      html  css  js  c++  java
  • 网络编程socket套接字及其使用(五)

    今天我们继续就网络编程进行深入的探讨,我们知道TCP/IP协议是面向连接的socket编程,也就是通信是基于连接,必须先建立连接,我们才可以进行通信。具体流程如下:

    服务器端流程:

    1. 创建套接字(socket)
    2. 将套接字绑定到一个本地地址和端口上(bind)
    3. 将套接字设为监听模式,准备接受客户请求(listen)
    4. 等待客户请求到来:当请求到来后,接受连接请求,返回一个新的对于此次连接的套接字(accept)
    5. 用返回的套接字和客户端进行通信(send/recv)
    6. 返回等待另一个客户请求。
    7. 关闭套接字。
    8. 代码如下:
       1 #include<Winsock2.h>
       2 #include<stdio.h>
       3 
       4 void main()
       5 {
       6     //load socket libariy
       7     WORD wVersionRequested;
       8     //this struct use to stored Windows Sockets value after call WSAStartup() function, 
       9     //include the data from Winscok.dll
      10     WSADATA wsaData;
      11     int err;
      12     wVersionRequested=MAKEWORD(1,1);
      13     err = WSAStartup(wVersionRequested,&wsaData);
      14     if(err!=0)
      15     {
      16         return;
      17     }
      18     if(LOBYTE(wsaData.wVersion)!=1 || (HIBYTE(wsaData.wVersion)!=1))
      19     {
      20         WSACleanup();
      21         return;
      22     }
      23     //socket listen
      24     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
      25     //server address information
      26     SOCKADDR_IN addrSrv;
      27     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//Default IP address
      28     addrSrv.sin_family=AF_INET;
      29     addrSrv.sin_port=htons(6000);                    //nPort
      30     //bind socket
      31     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
      32     //listen
      33     listen(sockSrv,5);
      34     
      35     //client address information
      36     SOCKADDR_IN addrClient;
      37     int len=sizeof(SOCKADDR);
      38     while(1)
      39     {
      40         //wait for client connect request
      41         SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
      42         char sendBuf[100];
      43         //printf client's address information
      44         sprintf(sendBuf,"Welcome %s to server.",inet_ntoa(addrClient.sin_addr));
      45         //send message
      46         send(sockConn,sendBuf,strlen(sendBuf)+1,0);
      47         //receive message from client
      48         char recvBuf[100];
      49         recv(sockConn,recvBuf,100,0);
      50         printf("%s
      ",recvBuf);
      51         //close socket
      52         closesocket(sockConn);
      53     }
      54 }
    9. 注:需在项目添加 ws2_32.lib 库模块(Project Setting--- Link -> Object/library modules).这里值得注意的是,程序的开头是先加载套接字的库,之后才开始进行按照1--7step执行的,所以确切的说第一步应该是套接字库的加载。

    客户端流程:

    1. 创建套接字(socket)
    2. 向服务器发出连接请求(connect)
    3. 和服务器进行通信(send/recv)
    4. 关闭套接字
    5. 代码如下:
       1 #include<Winsock2.h>
       2 #include<stdio.h>
       3 
       4 void main()
       5 {
       6     //load socket
       7     WORD wVersionRequested;
       8     //this struct use to stored Windows Sockets value after call WSAStartup() function, 
       9     //include the data from Winscok.dll
      10     WSADATA wsaData;
      11     int err;
      12     wVersionRequested=MAKEWORD(1,1);
      13     err = WSAStartup(wVersionRequested,&wsaData);
      14     if(err!=0)
      15     {
      16         return;
      17     }
      18     if(LOBYTE(wsaData.wVersion)!=1 || (HIBYTE(wsaData.wVersion)!=1))
      19     {
      20         WSACleanup();
      21         return;
      22     }
      23     //socket create
      24     SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
      25     //server address information
      26     SOCKADDR_IN addrSrv;
      27     addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
      28     addrSrv.sin_family=AF_INET;
      29     addrSrv.sin_port=htons(6000);
      30     //connect request
      31     connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
      32     //receve data
      33     char recvBuf[100];
      34     recv(sockClient,recvBuf,100,0);
      35     printf("%s
      ",recvBuf);
      36     //send data
      37     send(sockClient,"this is a message from client.",strlen("this is a message from client.")+1,0);
      38     //close socket
      39     closesocket(sockClient);
      40     WSACleanup();
      41 }

    End.

    谢谢.

  • 相关阅读:
    齐文词根词缀---3.25、cod/code-密码
    齐文词根词缀---3.24、oper操作
    Netty SSL双向验证
    带宽计算-大B和小B的区别
    Http2服务调用排坑记
    How to Use cURL HTTP/2 on macOS
    谈谈 HTTP/2 的协议协商机制
    springboot搭建http2服务器和h2c服务器 h2 的http/https 请求服务器
    Netty系列之Netty安全性
    转载 Netty tls验证
  • 原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/11776806.html
Copyright © 2011-2022 走看看