基于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 };

 

你可能感兴趣的:(windows)