bind 绑定函数(有三种结构体,这里只介绍一种)
通常,在一个SOCK_STREAM套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名
sockaddr_in 结构体
定义内容:
sin_family 地址族: 与socket()的第一个参数相同含义,必须为 AF_INET
sin_port 端口号
sin_addr IPv4 地址
sin_zero[8] 对齐
实例定义:
sockaddr_in sockAddr;//结构体名称为sockAddr sockAddr.sin_family = AF_INET; sockAddr.sin_port = htons(8888); sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
注:为了简化编程一般将IP地址设置为INADDR_ANY,如果需要使用特定的IP地址则需要使用inet_addr 和inet_ntoa完成字符串和in_addr结构体的互换
listen 监听函数
函数原型:
int listen(int sockfd//已绑定但未监听的套接字, int backlog//挂起连接队列的最大长度)
定义实例:
int listenStatus = listen(mySocket,10);
if(listenStatus == SOCKET_ERROR){
cout<<"listen error";
...
WSACleanup();
}
accept 接收连接请求
函数原型:
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
定义实例:
listen(Socket, 20);
SOCKET serverocket;
SOCKADDR clntAddr;
int nSize = sizeof(SOCKADDR);
cout << "Wait connection" << endl;
serverocket = accept(Socket//listen的第一个参数名, (SOCKADDR*)&clntAddr, &nSize);
connect 请求连接函数
客户端请求与服务器端建立连接
- socket 若未绑定, 操作系统赋值绑定
- addr 服务器端的地址结构
- addrlen 服务器端地址长度
- 返回值
- 成功: 返回 0
- 失败: 返回 SOCKET_ERROR
定义实例:
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(8828);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(cnetsocket,(sockaddr*)&server,sizeof(server)) == SOCKET_ERROR)
{
break;
}
send 发送数据函数
函数原型:
int send(SOCKET S, const char *buf , int len, int flags)
- 已连接的 socket
- buf 待发送缓冲区
- len 待发送内容长度
- flags 选项, 一般为0
定义实例:
char buf[1024] = {"abcdefghijklmnopqrstuvwxyz"};
int sent = 0;//已发送
int total_size = sizeof(buff);
sent = send(sock, buff+sent, total_size - sent, 0);
recv 接收数据函数
在已建立连接的 socket 上接收数据
函数原型:
int recv( SOCKET s,char* buf,int len,int flags);
- 已连接的 socket
- buf 接受缓冲区
- len 缓冲区长度
- flags 选项, 一般为 0
- 返回值
- 成功: 返回实际接收的字节数
- 连接已终止: 0
- 失败: 返回 SOCKET_ERROR
定义实例:
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);//这一步是初始化 n = recv(clntSocket, buffer, BUFFER_SIZE, 0)
(待续)
Reference
https://www.cnblogs.com/quehualin/p/9334030.html