C++ Socket TCP “Hello World!“

这是C++ SOCKET网络程序中的C/S结构之TCP "Hello World !",共两个控制台工程:

//
// TCPServer.cpp

#include <stdio.h>
#include <WINSOCK2.H>

#pragma comment(lib,"WS2_32.lib")
#define	BUF_SIZE	64		// 缓冲区大小

int main(void)
{
	WSADATA wsd;			// WSADATA变量
	SOCKET	sServer;		// 服务器套接字
	SOCKET  sClient;		// 客户端套接字
	int		retVal;			// 返回值
	char	buf[BUF_SIZE];	// 接受数据

	// 初始化套接字动态库
	ZeroMemory(buf,BUF_SIZE);
	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		printf("WSAStartup failed !/n");
		return 1;
	}

	// 创建套接字
	sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(INVALID_SOCKET == sServer)
	{
		printf("socket failed !/n");
		WSACleanup();
		return -1;
	}

	// 服务器套接字地址
	SOCKADDR_IN	addrServ;
	addrServ.sin_family = AF_INET;
	addrServ.sin_port = htons(4999);
	addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	// 绑定套接字
	retVal = bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN));
	if(SOCKET_ERROR == retVal)
	{
		printf("bind failed !/n");
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	// 监听套接字
	retVal = listen(sServer,1);
	if(SOCKET_ERROR == retVal)
	{
		printf("listen failed !/n");
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	// 接受客户请求
	sockaddr_in addrClient;
	int addrClientlen = sizeof(addrClient);
	sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
	if(INVALID_SOCKET == sClient)
	{
		printf("accept failed !/n");
		closesocket(sServer);
		WSACleanup();
		return -1;
	}
	
	// 接受客户数据
	retVal = recv(sClient,buf,BUFSIZ,0);
	if(SOCKET_ERROR == retVal)
	{
		printf("recv failed !/n");
		closesocket(sServer);
		closesocket(sClient);
		WSACleanup();
		return -1;
	}

	// 退出程序
	printf("Recv From Client:%s/n",buf);
	retVal = send(sClient,"Hello World !",strlen("Hello World !"),0);
	if(SOCKET_ERROR == retVal)
	{
		printf("send failed !/n");
		closesocket(sServer);
		closesocket(sClient);
		WSACleanup();
		return -1;
	}

	// 退出程序
	closesocket(sServer);
	closesocket(sClient);
	WSACleanup();
	return 0;
}

//
// TCPClient.cpp

#include <stdio.h>
#include <Winsock2.H>

#pragma comment(lib,"WS2_32.lib")
#define	BUF_SIZE	64			// 缓冲区大小

int main(void)
{
	WSADATA		wsd;			// 初始化数据库
	SOCKET		sHost;			// 服务器套接字
	SOCKADDR_IN servAddr;		// 服务器地址
	char		buf[BUF_SIZE];	// 接受数据缓冲区
	int			retVal;			// 返回值

	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		printf("WSAStartup failed !/n");
		return 1;
	}

	// 创建套接字
	sHost = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(INVALID_SOCKET == sHost)
	{
		printf("socket failed !/n");
		WSACleanup();
		return -1;
	}

	// 设置服务器地址
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.254");
	servAddr.sin_port = htons(4999);
	int sServerAddlen = sizeof(servAddr);
	
	// 连接服务器
	retVal = connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
	if(SOCKET_ERROR == retVal)
	{
		printf("connect failed !/n");
		closesocket(sHost);
		WSACleanup();
	}

	// 向服务器发送数据
	ZeroMemory(buf,BUF_SIZE);
	strcpy(buf,"Hello World !");
	retVal = send(sHost,buf,strlen(buf),0);
	if(SOCKET_ERROR == retVal)
	{
		printf("send failed !/n");
		closesocket(sHost);
		WSACleanup();
		return -1;
	}

	// 向服务器接受数据
	retVal = recv(sHost,buf,sizeof(buf)+1,0);
	printf("Recv From Server: %s/n",buf);

	// 退出程序
	closesocket(sHost);
	WSACleanup();
	return 0;
}

程序运行效果:

C++ Socket Hello World!

源代码下载地址:

http://download.csdn.net/source/1667113

http://www.rayfile.com/files/79dbe03a-a1fe-11de-83dd-0014221b798a/

C++ 基于tcp协议的socket通信需要使用socket编程库,可以使用标准的BSD socket API 或者是跨平台的Boost.Asio库。 下面是一个使用BSD socket API实现的简单的客户端和服务器端代码示例: 服务器端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { cout << "Failed to create socket!" << endl; return -1; } // 绑定地址和端口号 struct sockaddr_in address; memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8888); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) == -1) { cout << "Failed to bind socket!" << endl; return -1; } // 监听连接 if (listen(server_fd, 5) == -1) { cout << "Failed to listen socket!" << endl; return -1; } // 等待连接 int client_fd; struct sockaddr_in client_addr; socklen_t addr_len = sizeof(client_addr); if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len)) == -1) { cout << "Failed to accept connection!" << endl; return -1; } // 读取数据 char buffer[1024] = {0}; int read_len; if ((read_len = read(client_fd, buffer, 1024)) == -1) { cout << "Failed to read data!" << endl; return -1; } cout << "Received message: " << buffer << endl; // 发送数据 const char *response = "Hello World!"; if (write(client_fd, response, strlen(response)) == -1) { cout << "Failed to send data!" << endl; return -1; } // 关闭连接 close(client_fd); close(server_fd); return 0; } ``` 客户端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd == -1) { cout << "Failed to create socket!" << endl; return -1; } // 连接服务器 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) { cout << "Invalid address or address not supported!" << endl; return -1; } if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { cout << "Failed to connect server!" << endl; return -1; } // 发送数据 const char *message = "Hello Server!"; if (write(client_fd, message, strlen(message)) == -1) { cout << "Failed to send data!" << endl; return -1; } // 读取数据 char buffer[1024] = {0}; int read_len; if ((read_len = read(client_fd, buffer, 1024)) == -1) { cout << "Failed to read data!" << endl; return -1; } cout << "Received message: " << buffer << endl; // 关闭连接 close(client_fd); return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪宁宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值