首页 > 技术文章 > 基于Windows的套接字相关函数及示例

zinthos 2014-09-04 21:44 原文

链接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 };

 

推荐阅读