一、实现目的:
1.客户端向服务器端发送 内容;
2.服务器端接收 客户端发来的内容,并将此内容原样发回给客户端;
3.客户端接收 服务器端发来的内容并打印出来。
4.如果客户端向服务器端发送 exit ,则表示停止交互。
二、服务器端代码:
#include <iostream>
#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h> //为使用inetpton()或InetPton()函数做准备
#pragma comment (lib, "ws2_32.lib") //在编译时加载 ws2_32.dll
#define BUF_SIZE 100
int main()
{
//在使用DLL之前,需要调用WSAStartup()函数进行初始化,以指明WinSock规范的版本,
//初始化DLL
WSADATA wsaDATA;
//启动,WSA(Windows Sockets Asynchronous, Windows异步套接字)的启动命令,0表示成功
int ret_val = WSAStartup(MAKEWORD(2, 2), &wsaDATA); //ret_val代表return value
if (ret_val != 0)
{
std::cerr << "WSA failed to start up! Error code: " << WSAGetLastError() << std::endl;
system("pause");
exit(1);
}
std::cout << "WSA start up successfully..." << std::endl;
// 创建套接字,如果创建成功就返回新创建的套接字的描述符
SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建TCP套接字
if (servSock == INVALID_SOCKET)
{
std::cerr << "Failed to create server socket! Error code: " << WSAGetLastError() << std::endl;
WSACleanup();
system("pause");
exit(1);
}
std::cout << "Server socket created successfully..." << std::endl;
// 绑定套接字
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); // 每个字节都用0填充
sockAddr.sin_family = PF_INET; // 使用IPv4地址
//sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址,这是之前的老用法,这行会报错,提示用新的函数inet_pton
inet_pton(PF_INET, "127.0.0.1", &sockAddr.sin_addr); //新函数,绑定IP地址,#include <WS2tcpip.h>
sockAddr.sin_port = htons(1234); // 端口
// bind()函数执行成功,返回值为0,否则为SOCKET_ERROR
//bind 绑定要通信的程序,成为服务器,如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
ret_val = bind(servSock, (SO