Socket代码小例子——C++版

服务器端:

// HelloWorld2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 64

int main(int argc, _TCHAR* argv[])
{
	WSADATA wsd;					//WSADATA变量, 用于初始化Windows Sockets
	SOCKET sServer;					//服务器Socket,用于监听客户端请求
	SOCKET sClient;					//客户端Socket,用于实现与客户端通信
	int retVal;						//调用各种Socket函数返回值
	char buf[BUF_SIZE];				//用于接收客户端数据的缓冲区

	//初始化Winsock2.2
	WORD sockVersion = MAKEWORD(2, 2);
	if (WSAStartup(sockVersion, &wsd) != 0)
	{
		printf("WSAStartup 无法初始化!");
		return 1;
	}

	//显示wsaData中的数据
	printf("Version: %d.%d\n", LOBYTE(wsd.wVersion), HIBYTE(wsd.wVersion));
	printf("High Version: %d.%d\n", LOBYTE(wsd.wHighVersion), HIBYTE(wsd.wHighVersion));
	printf("Description: %s\n", wsd.szDescription);
	printf("System Status: %s\n", wsd.szSystemStatus);

	//创建TCP Socket
	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sServer == INVALID_SOCKET)
	{
		printf("socket error!");
	}
	
	//定义服务器地址
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;						//地址家族
	addr.sin_port = htons(9990);					//端口
	addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);	//地址
	
	//绑定到Socket
	retVal = bind(sServer, (SOCKADDR*)&addr, sizeof(struct sockaddr_in));
	if (retVal == SOCKET_ERROR)
	{
		printf("bind error!\n");
		closesocket(sServer);
		WSACleanup();
		return 1;
	}

	//监听
	retVal = listen(sServer, 1);
	if (retVal == SOCKET_ERROR)
	{
		printf("listen error!\n");
		closesocket(sServer);
		WSACleanup();
		return 1;
	}

	printf("TCPSocket Server start...\n");

	sockaddr_in addrClient;							//客户端地址
	int addrClientlen = sizeof(addrClient);
	sClient = accept(sServer, (sockaddr FAR*)&addrClient, &addrClientlen);
	if (sClient == INVALID_SOCKET)
	{
		printf("accept error!\n");
		closesocket(sServer);
		WSACleanup();
		return 1;
	}

	while (true)
	{
		ZeroMemory(buf, BUF_SIZE);
		retVal = recv(sClient, buf, BUFSIZ, 0);
		if (SOCKET_ERROR == retVal)
		{
			printf("recv error!\n");
			closesocket(sServer);
			closesocket(sClient);
			WSACleanup();
			return -1;
		}

		//获取当前系统时间
		SYSTEMTIME st;
		GetLocalTime(&st);
		char sDateTime[30];
		sprintf_s(sDateTime, "%4d-%2d-%2d  %2d:%2d:%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
		//printf("%s, Rev From Client [%s:%d] :%s\n", sDateTime, inet_ntoa(addrClient.sin_addr), addrClient.sin_port, buf);
		printf("%s, Rev From Client [%d] :%s\n", sDateTime, addrClient.sin_port, buf);
		//如果客户端发送“quit”字符串,则服务器退出
		if (strcmp(buf, "quit") == 0)
		{
			retVal = send(sClient, "quit", strlen("quit"), 0);
			break;
		}
		//否则向客户端发送回显字符串
		else
		{
			char msg[BUF_SIZE];
			sprintf_s(msg, "Message received - %s", buf);
			retVal = send(sClient, msg, strlen(msg), 0);
			if (SOCKET_ERROR == retVal)
			{
				printf("send error!\n");
				closesocket(sServer);
				closesocket(sClient);
				WSACleanup();
				return -1;

			}
		}
	}

	closesocket(sServer);
	closesocket(sClient);
	//最后做一些清理工作
	if (WSACleanup() == SOCKET_ERROR)
	{
		printf("WSACleanup 出错!");
	}
	system("pause");
    return 0;
}

 

客户端:

// TcpSocketClient.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 64

int main(int argc, _TCHAR* argv[])
{
	WSADATA wsd;											//WSADATA变量, 用于初始化Windows Sockets
	SOCKET sHort;											//与服务器通信的Sockets
	SOCKADDR_IN servAddr;									//服务器地址
	int retVal;												//调用各种Socket函数返回值
	char buf[BUF_SIZE];										//用于接收客户端数据的缓冲区

	//初始化Winsock2.2
	WORD sockVersion = MAKEWORD(2, 2);
	if (WSAStartup(sockVersion, &wsd) != 0)
	{
		printf("WSAStartup 无法初始化!");
		return -1;
	}

	//显示wsaData中的数据
	printf("Version: %d.%d\n", LOBYTE(wsd.wVersion), HIBYTE(wsd.wVersion));
	printf("High Version: %d.%d\n", LOBYTE(wsd.wHighVersion), HIBYTE(wsd.wHighVersion));
	printf("Description: %s\n", wsd.szDescription);
	printf("System Status: %s\n", wsd.szSystemStatus);

	//创建TCP Socket
	sHort = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sHort == INVALID_SOCKET)
	{
		printf("socket error!\n");
		WSACleanup();
		return -1;
	}

	//定义服务器地址
	servAddr.sin_family = AF_INET;									//地址家族
	servAddr.sin_port = htons(9990);								//端口
	servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.102");		//地址http://jingyan.baidu.com/article/1709ad8097e5904634c4f03e.html

	int sServerAddlen = sizeof(servAddr);							//计算地址的长度

	//连接服务器
	retVal = connect(sHort, (LPSOCKADDR)&servAddr, sizeof(servAddr));
	if (retVal == SOCKET_ERROR)
	{
		printf("connect error!\n");
		closesocket(sHort);
		WSACleanup();
		return -1;
	}

	while (true)
	{
		//向服务器发送数据
		printf("Please input a string to send: ");
		std::string str;
		//接收输入的数据
		std::getline(std::cin, str);
		//将用户输入的数据复制到buf中
		ZeroMemory(buf, BUF_SIZE);
		strcpy(buf, str.c_str());
		//向服务器发数据
		retVal = send(sHort, buf, strlen(buf), 0);
		if (SOCKET_ERROR == retVal)
		{
			printf("send error!\n");
			closesocket(sHort);;
			WSACleanup();
			return -1;
		}
		//接收服务器回传数据
		retVal = recv(sHort, buf, strlen(buf)+1, 0);
		printf("Recv Form Server: %s\n", buf);

		if (strcmp(buf, "quit") == 0)
		{
			printf("quit!\n");
			break;
		}
	}

	closesocket(sHort);
	//最后做一些清理工作
	if (WSACleanup() == SOCKET_ERROR)
	{
		printf("WSACleanup 出错!");
	}
	system("pause");
	return 0;
}

源自《WIndows网络编程》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值