步骤:
1.新建一个空项目,项目名称为Server,解决方案名称为Socket;
2.新建一个空项目名称为Client;
3.为Server构建一个头文件,一个源文件,Client同理。
4.右击项目Client,将SDL检查改为否。
5.按ctrl+F5先运行Server,再右击"Client"->调试->启动新实例;
6.开始运行,可以互相发送消息了。
#include"Client.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{
init_Socket();
SOCKET fd = CreateClientSocket("127.0.0.1");
printf("Server connected...\n");
printf("tip:Enter 'end' to end the connection\n");
//发送消息
char recvbuf[BUFSIZ] = { 0 };
char sendbuf[BUFSIZ] = { 0 };
char endbuf[BUFSIZ] = { "end" };
while (true)
{
//发送消息
printf("send>");
gets_s(sendbuf, BUFSIZ);
//输入'end'断开连接
if (strcmp(sendbuf, endbuf) == 0)
{
return false;
}
if (SOCKET_ERROR == send(fd, sendbuf, strlen(sendbuf), 0))
{
err("send");
}
//接收消息
if (0 < recv(fd, recvbuf, BUFSIZ, 0))
{
printf("recv:%s\n", recvbuf);
memset(recvbuf, 0, sizeof(recvbuf));
}
}
closesocket(fd);
close_Socket();
system("pause");
return 0;
}
bool init_Socket()
{
WSADATA wsadata;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
{
printf("WSAStartup failed code %d", WSAGetLastError());
return false;
}
//WSA Windows异步套接字
//parm1 请求的Socket版本
//parm2 传出参数
return true;
}
bool close_Socket()
{
if (0 != WSACleanup())
{
printf("WSACleanup failed code %d", WSAGetLastError());
return false;
}
return true;
}
SOCKET CreateClientSocket(const char* ip)
{
//1 创建空的Socket
//af 地址协议族
//type 传输协议类型: 流式套接字 数据报套接字
//protocol 使用的具体传输协议
SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == INVALID_SOCKET)
{
err("socket");
return INVALID_SOCKET;
}
//2 与服务器建立连接
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.S_un.S_addr = inet_addr(ip);
if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr)))
{
err("connect");
return false;
}
return fd;
}
C++程序实现客户端与服务器之间的通信。`int main()`函数中包含了初始化套接字、创建客户端socket、建立连接、发送和接收数据以及关闭连接等步骤:
-
`init_Socket()` 函数用于初始化Windows异步套接字API(Winsock),如果初始化失败,会返回false并打印错误信息。
-
`CreateClientSocket()` 创建一个新的socket连接到指定的IP地址(这里是127.0.0.1),表示本地回环测试。
-
客户端通过循环不断提示用户输入消息,然后发送给服务器。如果输入的是"end",则结束连接并返回false。
-
接收服务器发回的消息,并将其打印出来。
-
当接收或发送数据失败时,会捕获错误并通过`err()`函数打印错误信息。
-
连接结束后,调用`closesocket(fd)`关闭套接字,然后`close_Socket()`关闭整个Winsock库,最后系统暂停进程等待用户按键。