c++ socket 入门练手

#include<iostream>
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
	int RetVal;
	WORD SocketVersion = MAKEWORD(2, 2);
	WSADATA wsd;
	if (WSAStartup(SocketVersion, &wsd) != 0)
	{
		cout << "绑定Socket库失败" << endl;
	}
	SOCKET ServerSocket;
	ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (ServerSocket == INVALID_SOCKET)
	{
		cout << "创建服务器套接字失败" << endl;
		WSACleanup();
		return -1;
	}
	SOCKADDR_IN ServerAddr;
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(6000);
	ServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;
	RetVal = bind(ServerSocket, (SOCKADDR*)& ServerAddr, sizeof(SOCKADDR_IN));
	if (RetVal == SOCKET_ERROR)
	{
		cout << "套接字绑定失败" << endl;
		closesocket(ServerSocket);
		WSACleanup();
		return -1;
	}
	RetVal = listen(ServerSocket, 2);
	if (RetVal == SOCKET_ERROR)
	{
		cout << "套接字监听失败" << endl;
		closesocket(ServerSocket);
		WSACleanup();
		return -1;
	}
	SOCKET ClientSocket;
	SOCKADDR_IN ClientAddr;
	int ClientAddrLen = sizeof(ClientAddr);
	ClientSocket = accept(ServerSocket, (SOCKADDR*)& ClientAddr, &ClientAddrLen);
	if (ClientSocket == INVALID_SOCKET)
	{
		cout << "接收客户端请求失败" << endl;
		closesocket(ServerSocket);
		WSACleanup();
		return -1;
	}
	char ReceiveBuff[BUFSIZ];
	char SendBuff[BUFSIZ];
	while (true)
	{
		ZeroMemory(ReceiveBuff, BUFSIZ);
		RetVal = recv(ClientSocket, ReceiveBuff, BUFSIZ, 0);
		if (RetVal == SOCKET_ERROR)
		{
			cout << "接收数据失败" << endl;
			closesocket(ServerSocket);
			closesocket(ClientSocket);
			WSACleanup();
			return -1;
		}
		cout << "接收自客户端数据:" << ReceiveBuff << endl;
		cout << "向客户端发送数据:";
		cin >> SendBuff;
		send(ClientSocket, SendBuff, strlen(SendBuff), 0);
	}
	closesocket(ServerSocket);
	closesocket(ClientSocket);
	WSACleanup();
	return 0;
}
#include "winsock2.h"
#include <iostream>
#include<random>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996) //必须加上
using namespace std;
BOOL RecvLine(SOCKET s, char* buf); //读取一行数据
bool ConStatus = false;

bool judgeLegalStr(const char* getData,const char* sample) {
	if (strlen(getData)==0) {
		return true;
	}
	if (strlen(getData) != strlen(sample)) {
		return false;
	}
	for (int i = 0; i < strlen(sample); ++i) {
		if (getData[i] != sample[i]) {
			return false;
		}
	}
	return true;
}


int main(int argc, char* argv[])
{
	const int BUF_SIZE = 64;

	WSADATA wsd; //WSADATA变量
	SOCKET sHost; //服务器套接字
	SOCKADDR_IN servAddr; //服务器地址
	char buf[BUF_SIZE]="Java测试"; //接收数据缓冲区
	char bufRecv[BUF_SIZE];
	int retVal; //返回值
				//初始化套结字动态库
	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
	{
		cout << "WSAStartup failed!" << endl;
		return -1;
	}
	//创建套接字
	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sHost)
	{
		cout << "socket failed!" << endl;
		WSACleanup();//释放套接字资源
		return  -1;
	}
	
	//设置服务器地址
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	servAddr.sin_port = htons((short)6000);
	int nServAddlen = sizeof(servAddr);

	//连接服务器
	retVal = connect(sHost, (LPSOCKADDR)& servAddr, sizeof(servAddr));
	if (SOCKET_ERROR == retVal)
	{
		cout << "connect failed!" << endl;
		closesocket(sHost); //关闭套接字
		WSACleanup(); //释放套接字资源
		return -1;
	}
	cout << " 向服务器发送数据:  "<<buf<<endl;
	
	retVal = send(sHost, buf, strlen(buf), 0);
	ZeroMemory(bufRecv, BUF_SIZE);
	recv(sHost, bufRecv, BUF_SIZE, 0);

	ConStatus = judgeLegalStr(bufRecv,"success");//得到的指令是否为success

	while (ConStatus)
	{
		ZeroMemory(bufRecv, BUF_SIZE);
		if (recv(sHost, bufRecv, BUF_SIZE, 0) == SOCKET_ERROR){
			cout << "connect failed!" << endl;
			closesocket(sHost); //关闭套接字
			WSACleanup(); //释放套接字资源
			return -1;
		}
		if (!(judgeLegalStr(bufRecv, "game_over"))) {
			if (judgeLegalStr(bufRecv, "begin")) {
				ZeroMemory(buf, BUF_SIZE);
				cout << " 向服务器发送数据:  ";
				cin >> buf;
				retVal = send(sHost, buf, strlen(buf), 0);
			}
			else {
				cout << " 向服务器接收数据:  "<< bufRecv<<endl;
			}
		}
		else {
			break;
		}

		

	}
	//退出
	closesocket(sHost); //关闭套接字
	WSACleanup(); //释放套接字资源
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值