• 【Windows网络编程】二.TCP套接字编程与主机上线实验


    API:

    • socket

      套接字函数创建绑定到特定传输服务提供程序的套接字。

      • 函数原型:
        SOCKET WSAAPI socket(
          [in] int af,
          [in] int type,
          [in] int protocol
        );
        
        • 1
        • 2
        • 3
        • 4
        • 5
      • 参数:
        • af:地址规范系列:

          AF_INET:IPv4,AF_INET6:IPv6

        • type:新套接字的类型规范

          SOCK_STREAM:TCP

          SOCK_DGRAM:UDP

        • protocol:

          如果指定值 0,则调用方不希望指定协议,服务提供商将选择要使用的 协议

      • 返回值:如果未发生错误,套接字将返回引用新套接字的描述符,否则,将返回值INVALID_SOCKET,并且可以通过调用WSAGetLastError来检索特定的错误代码
    • listen:

      侦听函数将套接字置于侦听传入连接的状态

      • 函数原型:

        int WSAAPI listen(
          [in] SOCKET s,
          [in] int    backlog
        );
        
        • 1
        • 2
        • 3
        • 4
      • 参数:

        s:表示绑定的未连接的套接字的描述符

        backlog:挂起的连接队列的最大长度

      • 返回值:如果未发生错误,侦听将返回0

    • accept:

      连接套接字

    • sockopt:

      设置套接字选项

      • 函数原型:
        int setsockopt(
          [in] SOCKET     s,
          [in] int        level,
          [in] int        optname,
          [in] const char *optval,
          [in] int        optlen
        );
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      • 参数:
        • s:标识套接字的描述符
        • level:定义选项的级别
        • optname:要为其设置的套接字选项
        • optval:指向指定请求选项值得缓冲区的指针
        • optlen:缓冲区大小
      • 返回值:

    TCP服务端:

    #include 
    #include 
    #pragma comment(lib,"ws2_32.lib")
    
    int main() {
    	WORD wVersionRequested = MAKEWORD(2, 2);
    	WSADATA lpWSAData;
    	//启动Winsock DLL的使用
    	if (WSAStartup(wVersionRequested, &lpWSAData)) {
    		std::cout << "WSAStartup Error!" << std::endl;
    		system("pause");
    		return 0;
    	}
    	if (LOBYTE(wVersionRequested)!=2||HIBYTE(wVersionRequested)!=2)
    	{
    		WSACleanup();
    		std::cout << "wVersion Error!" << std::endl;
    	}
    	
    	//创建套接字:
    	SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
    	SOCKADDR_IN addSrv;
    	addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	addSrv.sin_family = AF_INET;
    	addSrv.sin_port = htons(8000);
    
    	//绑定:
    	bind(socSrv, (sockaddr*)&addSrv, sizeof(sockaddr));
    
    	//监听:
    	listen(socSrv,5);
    
    	SOCKADDR_IN addrClient;
    	int nLength = sizeof(sockaddr);
    
    	while (true) {
    		//在套接字上尝试传入连接
    		SOCKET sockConn = accept(socSrv, (sockaddr*)&addrClient, &nLength);
    		//向客户端发送消息:
    		send(sockConn, "已登录至服务器", strlen("已登录至服务器") + 1, 0);
    		char recvBuffer[MAX_PATH]{ 0 };
    		recv(sockConn, recvBuffer, MAX_PATH, 0);
    		std::cout << "客户端消息:" << recvBuffer << std::endl;
    	}
    
    	closesocket(socSrv);
    	WSACleanup();
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    TCP客户端:

    #include 
    #include 
    #pragma comment(lib,"ws2_32.lib")
    
    int main() {
    	//初始化Winsock DLL的使用
    	WORD wVersionRequested = MAKEWORD(2, 2);
    	WSAData lpWSAData;
    	if (WSAStartup(wVersionRequested, &lpWSAData)) {
    		printf("WSAStartup Error!\r\n");
    		system("pause");
    		return 0;
    	}
    	if (LOBYTE(wVersionRequested) != 2 || LOBYTE(wVersionRequested) != 2) {
    		printf("wVersion Error!\r\n");
    		system("pause");
    		return 0;
    	}
    	
    	//创建套接字:
    	SOCKET SocClient = socket(AF_INET, SOCK_STREAM, 0);
    
    	SOCKADDR_IN addSrv;
    	addSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	addSrv.sin_family = AF_INET;
    	addSrv.sin_port = htons(8000);
    
    	//连接
    	connect(SocClient, (sockaddr*)&addSrv, sizeof(sockaddr));
    
    	char recvBuffer[MAX_PATH]{ 0 };
    	recv(SocClient, recvBuffer, MAX_PATH, 0);
    
    	printf("服务器端消息:%s\r\n", recvBuffer);
    
    	send(SocClient, "Hello Server", strlen("Hello Server") + 1, 0);
    
    	closesocket(SocClient);
    
    	WSACleanup();
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    PMP备考大全:经典题库(8月第4周)
    给大家看下刚薅的阿里云99元服务器CPU性能如何?
    目标检测YOLO实战应用案例100讲-基于YOLOv5的航拍图像旋转目标检测(下)
    Effective C++改善程序与设计的55个具体做法 9. 杂项讨论
    持续投入商品研发,叮咚买菜赢在了供应链投入上
    CSS基础-嵌套规范(拓展),居中方法,CSS 特性
    电影管理系统
    小白入门深度学习 | 6-6:Inception v3 算法原理
    建筑施工员证怎么考?报名条件及报考时间是什么?
    Pytorch中 nn.Transformer的使用详解与Transformer的黑盒讲解
  • 原文地址:https://blog.csdn.net/qq_73985089/article/details/134282127