zoukankan      html  css  js  c++  java
  • 基于Windows的套接字相关函数及示例

    链接ws2_32.lib库

    头文件#include <winsock2.h>

    1  int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);

    初始化Winsock库

    wVersionRequested:Winsock版本信息,用MAKEWORD宏构造,MAKEWORD(2,2)。

    lpWSAData:WSADATA结构体变量的地址。无特殊含义,但是要传递结构体变量地址。

    1 int WSACleanup();

    注销Winsock相关库,成功返回0,失败返回SOCKET_ERROR。

    1 SOCKET socket(int af, int type, int protocol);

    成功返回套接字句柄,失败返回INVALID_SOCKET。

    af:套接字中使用的协议族信息,常用的是PF_INET,IPv4互联网协议族。

    type:套接字数据传输类型信息。有面向连接的套接字(SOCK_STREAM),面向消息的套接字(SOCK_DGRAM)。

    protocol:计算机间通信中使用的协议信息。选择最终协议,IPv4网络协议族中面向连接的协议(IPPROTO_TCP),面向消息的协议(IPPROTO_UDP)。

    1 int bind(SOCKET s, struct sockaddr * name, int namelen);

    成功返回0,失败返回SOCKET_ERROR。

    1 int listen(SOCKET s, int backlog);

    成功返回0,失败返回SOCKET_ERROR。

    1 SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);

    成功返回套接字句柄,失败返回INVALID_SOCKET。

    1 int connect(SOCKET s, struct sockaddr * name, int namelen);

    成功返回0,失败返回SOCKET_ERROR。

    1 int closesocket(SOCKET s);

    关闭套接字,成功返回0,失败返回SOCKET_ERROR。

    1 int send(SOCKET s,const char * buf, int len, int flags);

    数据传输函数,成功返回传输字节数,失败返回SOCKET_ERROR。

    s:数据传输对象连接的套接字句柄值。

    buf:保存待传输数据的缓冲地址值。

    len:要传输的字节数。

    flags:传输数据时要用到的多种选项信息。

    1 int recv(SOCKET s, const char * buf, int len, int flags);

    成功时返回接受的字节数,收到EOF时为0,失败时返回SOCKET_ERROR。

    s:数据接收对象连接的套接字句值。

    buf:保存接收数据的缓冲地址值。

    len:能够接受的最大字节数。

    flags:接受数据时用到的多种选项信息。

     1 #include <WinSock2.h>
     2 #include <iostream>
     3 
     4 namespace WinSock {
     5 
     6     void ErrorHandling(char* message) {
     7         std::cerr << message << std::endl;
     8         exit(1);
     9     }
    10 
    11     int Server(int port) {
    12         WSADATA wsaData;
    13         SOCKET hServSock, hClntSock;
    14         SOCKADDR_IN servAddr, clntAddr;
    15         int szClntAddr;
    16         char message[] = "Hello World!";
    17         if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error");
    18         hServSock = socket(PF_INET, SOCK_STREAM, 0);
    19         if (hServSock == INVALID_SOCKET) ErrorHandling("socket() error");
    20         memset(&servAddr, 0, sizeof(servAddr));
    21         servAddr.sin_family = AF_INET;
    22         servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    23         servAddr.sin_port = htons(port);
    24         if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("bind() error");
    25         if (listen(hServSock, 5) == SOCKET_ERROR) ErrorHandling("listen() error");
    26         szClntAddr = sizeof(clntAddr);
    27         hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
    28         if (hClntSock == INVALID_SOCKET) ErrorHandling("accept() error");
    29         send(hClntSock, message, sizeof(message), 0);
    30         closesocket(hClntSock);
    31         closesocket(hServSock);
    32         WSACleanup();
    33         return 0;
    34     }
    35 
    36     int Client(char ip[], int port) {
    37         WSADATA wsaData;
    38         SOCKET hSocket;
    39         SOCKADDR_IN servAddr;
    40         char message[30];
    41         int strLen;
    42         if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error");
    43         hSocket = socket(PF_INET, SOCK_STREAM, 0);
    44         if (hSocket == INVALID_SOCKET) ErrorHandling("socket() error");
    45         memset(&servAddr, 0, sizeof(servAddr));
    46         servAddr.sin_family = AF_INET;
    47         servAddr.sin_addr.S_un.S_addr = inet_addr(ip);
    48         servAddr.sin_port = htons(port);
    49         if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("connect() error");
    50         strLen = recv(hSocket, message, sizeof(message) - 1, 0);
    51         if (strLen == -1) ErrorHandling("read() error");
    52         std::cout << "Message from server: " << message << std::endl;
    53         closesocket(hSocket);
    54         WSACleanup();
    55         return 0;
    56     }
    57 
    58 };
  • 相关阅读:
    html5 geolocation配合百度地图api实现定位
    ES6 Symbol
    es2018(es9)前瞻
    Vue探索历程(一)
    数独游戏的难度等级分析及求解算法研究1——关于数独
    关于谋生的一些想法
    加密的pdf转换为jpg
    数独游戏的难度等级分析及求解算法研究2——数独难度等级
    NSString NSData char* NSInteger的转换
    根据文字多少自动设置UILabel的宽度高度
  • 原文地址:https://www.cnblogs.com/zinthos/p/3956928.html
Copyright © 2011-2022 走看看