1.服务器端步骤:创建套接字,绑定,监听,接收连接(accept)
#include <iostream>
#include<windows.h>
#include<winsock2.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")void main()
{//API提供的调用方可使用的最高版本号WORD wVersionRequested = MAKEWORD(2, 2);WSADATA wsaData;//向操作系统说明,我们要用哪个库文件,让该库文件与当前的应用程序绑定//该函数执行成功后返回0int err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return; }if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){//应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来//解除与Socket库的绑定并且释放Socket库所占用的系统资源WSACleanup();return;}//第一步:创建套接字//SOCK_STREAM为TCP,SOCK_DGRAM为UDPSOCKET socketSer = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSer, addrCli;addrSer.sin_family = AF_INET;addrSer.sin_port = htons(5050); // 将主机字节顺序转为网络字节顺序addrSer.sin_addr.S_un.S_addr = inet_addr("192.168.1.1");//第二步:绑定套接字bind(socketSer, (sockaddr*)&addrSer, sizeof(SOCKADDR));//第三步:监听listen(socketSer, 5); //第2个参数表示队列大小cout << "Server Wait Client Connect......." << endl;//第四步:接收连接SOCKET sockConn = accept(socketSer, (sockaddr*)&addrCli, &(sizeof(SOCKADDR)));if (sockConn == INVALID_SOCKET)//INVALID_SOCKET非法套接字{cout << "Server Accept Client Connect Fail" << endl;return;}else{cout << "Server Accept Client Connect Success" << endl;return;}char sendbuf[256];char recvbuf[256];while (1){cout << "Ser:>";cin >> sendbuf; //缓冲区if (strcpy(sendbuf, "quit") == 0){break;}send(sockConn, sendbuf, strlen(sendbuf) + 1, 0);//套接字,缓冲,长度recv(sockConn, recvbuf, 256, 0);cout << "Cli:>" << recvbuf << endl;}closesocket(socketSer);WSACleanup();//清除版本信息
}
2.客户端步骤:创建套接字,连接服务器(connect)
#include<iostream>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(2, 2);err = WSAStarup(wVersionRequested, &wsaData);if (err != 0){//tell the user that we could nto find a usable//WinSock DLL;return;}if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){WSACleanup();return;}//第一步:创建套接字SOCKET sockCli;sockCli = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSer;addrSer.sin_family = AF_INET;addrSer.sin_port = htons(5050);addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//第二步:向服务器发起连接请求int res = connect(sockCli, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));//res为connect返回值 查阅相关函数,若为0则表示没有错误if (res != 0){cout << "Client Connect Servrer Fail!" << endl;return;}else{cout << "Client Connect Servrer Success!" << endl;}char sendbuf[256];char recvbuf[256];//发空间和接收空间while (1){//接收recv(sockCli, recvbuf, 256, 0);cout << "Ser:>" << recvbuf << endl;cout << "Cli:>";cin >> sendbuf;if (strcmp(sendbuf, "quit") == 0)//客户端请求退出{break;}//发送send(sockCli, sendbuf, strlen(sendbuf) + 1, 0);}closesocket(sockCli);WSACleanup();
}
常见问题:待补充。。。