简单的 winsocket TCP通信

//服务器
#include<iostream>
#include<WinSock2.h>                    // socket 所需要的头文件
#pragma comment(lib,"WS2_32.lib")// link socket 库
#define PORT 9999 
#define BUFLEN 1024
using namespace std;
int main()
{
	WSADATA wsaData;
	// 1 启动并初始化winsock(WSAStarup)
	if (WSAStartup(MAKEWORD(2, 2), &wsaData))//成功返回0
	{
		return FALSE;
	}
	//2 创建套接字(socket)
	SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(INVALID_SOCKET == sServer)
	{
		WSACleanup();
		return FALSE;
	}
	//3 准备通信地址
	SOCKADDR_IN addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(PORT);
	addrServer.sin_addr.s_addr = INADDR_ANY;//任意可用地址
   //4 绑定地址与socket(bind)
	if (SOCKET_ERROR==bind(sServer, (const sockaddr*)&addrServer, sizeof(SOCKADDR_IN)))
	{
		closesocket(sServer);
		WSACleanup();
		
		return FALSE;
	}
	//5 监听 (listen)
	if (SOCKET_ERROR == listen(sServer, SOMAXCONN))
	{
		closesocket(sServer);
		WSACleanup();
	}
	// 6 等待客户端连接(accpet)
	sockaddr_in addrClient;
	int addrClientLen = sizeof(addrClient);
	cout << "服务器启动成功,等待客户端连接中。。。。" << endl;
	SOCKET sClient = accept(sServer, (sockaddr *)&addrClient, &addrClientLen);
	if (INVALID_SOCKET == sClient)
	{
		cout << WSAGetLastError() << endl;
		closesocket(sServer);
		closesocket(sClient);
		WSACleanup();
		return FALSE;
	}
	//7 接收数据(recv)
	char recvBuf[BUFLEN];
	ZeroMemory(recvBuf, sizeof(recvBuf));
	if (SOCKET_ERROR == recv(sClient, recvBuf, sizeof(recvBuf), 0))
	{
		closesocket(sServer);
		closesocket(sClient);
		WSACleanup();
		return FALSE;
	}
	cout << "客户端(" << inet_ntoa(addrClient.sin_addr) << ":" << addrClient.sin_port << "):" << recvBuf << endl;
	//8 发送数据
	char sendBuf[BUFLEN] = "你好客户端!";
	if (SOCKET_ERROR==send(sClient, sendBuf, sizeof(sendBuf), 0))
	{
		closesocket(sServer);
		closesocket(sClient);
		WSACleanup();
		return FALSE;
	}
	system("pause");
	system("pause");
	return TRUE;
}
/*
注:1:MAKEWORD把参数组成一个WORD(双字节)类型数据并返回这个WORD类型数值,高位代表(修订本)号,低位字节指定主版本号(其代表)
2:socket(AF_INET,//The Internet Protocol version 4 (IPv4) address family
SOCK_STREAM,//, two-way,This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6).
IPPROTO_TCP//The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM.
)
*/
//客户端
#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
#define BUFLEN 1024
#define PORT 9999 
void getIP(char*szHostaddress);
int main()
{

	WSADATA wsaData;
	// 1 启动并初始化winsock(WSAStarup)
	if (WSAStartup(MAKEWORD(2, 2), &wsaData))//成功返回0
	{
		return FALSE;
	}
	//2 创建套接字(socket)
	SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sHost)
	{
		closesocket(sHost);
		WSACleanup();
		return FALSE;
	}
	//3 准备通信地址
	char szHostaddress[200];
	getIP(szHostaddress);
	SOCKADDR_IN addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(PORT);
	addrServer.sin_addr.s_addr = inet_addr(szHostaddress);
	//4 连接服务器(connect)
	if (SOCKET_ERROR == connect(sHost, (const sockaddr*)&addrServer, sizeof(addrServer)))
	{
		closesocket(sHost);
		WSACleanup();
		return FALSE;
	}
	//5 发送数据 (send)
	char sendBuf[BUFLEN] = "你好服务器!";
	if (SOCKET_ERROR == send(sHost, sendBuf, sizeof(sendBuf), 0))
	{
		closesocket(sHost);
		WSACleanup();
		return FALSE;
	}
	cout << "客户端发送消息成功!" << endl;
	//7 接收数据(recv)
	char recvBuf[BUFLEN];
	ZeroMemory(recvBuf, sizeof(recvBuf));
	if (SOCKET_ERROR == recv(sHost, recvBuf, sizeof(recvBuf), 0))
	{
		closesocket(sHost);
		WSACleanup();
		return FALSE;
	}
	cout << "服务器发来的消息:" <<recvBuf<< endl;
	system("pause");
}
void getIP(char*szHostaddress){
	char szHostname[100];
	if (gethostname(szHostname, sizeof(szHostname)) != SOCKET_ERROR)//先得到主机名
	{
		HOSTENT *pHostEnt = gethostbyname(szHostname);//通过名字拿到地址
		if (pHostEnt != NULL)
		{
			sprintf(szHostaddress, "%d.%d.%d.%d",
				(pHostEnt->h_addr_list[0][0] & 0x00ff),
				(pHostEnt->h_addr_list[0][1] & 0x00ff),
				(pHostEnt->h_addr_list[0][2] & 0x00ff),
				(pHostEnt->h_addr_list[0][3] & 0x00ff));
		}
	}
	else
		return;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值