服务器端:
- socket() ——创建1个socket
- bind() ——绑定IP地址、端口号等信息到socket上
- listen() ——监听,设置允许最大连接数
- accept() ——接受客户端的请求连接
- send() 和 recv() / read() 和 write() ——收发数据
- closesocket()——关闭网络连接
//服务器 server.cpp
#define _WINSOCK_DEPRECATED_NO_WARNINGS
//inet_ntoa()函数已经过期,推荐使用inet_ntop()函数或者InetNtop()函数来替代该过期函数,或者定义_WINSOCK_DEPRECATED_NO_WARNINGS来不显示这个告警信息
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib")
//为了包含头文件WinSock2进行各种函数的调用(WSAstarup),链接到ws2_32.lib
void main()
{
/* 1. 加载 WinSock 库 */
WSADATA wsaData;
//WSADATA这个结构被用来存储 被WSAStartup函数调用后返回的Windows Sockets数据
int port = 5099;
char buf[] = "Server: hi, I am a server......";
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
//搜索相应的Socket库并绑定,执行成功返回0 版本2.2
printf("failed"); return ;
}
/* 2. 创建用于监听的套接字 socket() */
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
//参数:AdressFamily地址类型ipv4 | 数据传输方式SOCK_STREAM 和 SOCK_DGRAM数据报 | 传输协议(系统可自动推断)
/* 3. 配置监听的地址和端口 */
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(port);//1024以上的端口号
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//addrSrv.sin_addr.S_un.S_addr = htons(INADDR_ANY); 都可
//htones将主机字节顺序转换为网络字节顺序
/* 4. 服务器绑定监听socket:bind() listen()*/
int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));
if (retVal == SOCKET_ERROR) {
printf("fail bind:%d\n", WSAGetLastError());
return ;
}
if (listen(sockSrv, 10) == SOCKET_ERROR) {
printf("fail listen:%d\n", WSAGetLastError());
return ;
}
/* 5. 服务端accept等待客户端连接 ( 客户端连接connect) */
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrClient, &len);
if (sockConn == SOCKET_ERROR) {
printf("accept failed:%d", WSAGetLastError());
}
printf("accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr));
/* 6. 发送接收数据 */
//发送数据
int iSend = send(sockConn, buf, sizeof(buf), 0);
if (iSend == SOCKET_ERROR) printf("send failed");
//接收数据
char recvBuf[100];
memset(recvBuf, 0, sizeof(recvBuf));
recv(sockConn, recvBuf, sizeof(recvBuf), 0);
printf("%s\n", recvBuf);
/* 7. 关闭socket*/
closesocket(sockConn);
closesocket(sockSrv);
WSACleanup();
system("pause");
}
客户端 :
- socket()——创建1个socket
- 设置要连接的服务端的IP地址、端口等属性
- connect()——连接服务器
- send() 和 recv() / read() 和 write() ——收发数据
- closesocket()——关闭网络连接
//客户端 client.cpp
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
/* 1. 加载 WinSock 库 */
WSADATA wsaData;
char buff[1024];
memset(buff, 0, sizeof(buff));
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("failed to load Winsock");
return;
}
/* 2. 创建用于通讯的套接字 socket() */
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKET_ERROR == sockClient) {
printf("Socket() error:%d", WSAGetLastError());
return;
}
/* 3. 设置要连接的服务端的ip地址,端口等属性*/
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5099);
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
/* 4. 向服务器发送连接请求*/
if (connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {
printf("Connect falied:%d", WSAGetLastError());
return;
}
/* 5. 接收,发送数据*/
//接收数据
recv(sockClient, buff, sizeof(buff), 0);
printf("%s\n", buff);
//发送数据
char buffSend[] = "hello, I am a client......";
send(sockClient, buffSend, sizeof(buffSend), 0);
/* 6. 关闭socket*/
closesocket(sockClient);
WSACleanup();
system("pause");
}
运行结果: