C++ Socket 实例

服务端:
#include "stdafx.h"
#include <Winsock2.h>
#include <cstdio>
#include <iostream>


#pragma comment(lib,"ws2_32.lib")

int main()
{
	WSADATA wsdata = {0};
	WSAStartup(MAKEWORD(2, 2), &wsdata);   //Winsock服务的初始化,这句话一定要放在前面
	SOCKET socketServer = socket(AF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN addserver;
	addserver.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY表示任何IP
	addserver.sin_family = AF_INET;
	addserver.sin_port = htons(6000);
	auto res=bind(socketServer, (SOCKADDR*)&addserver, sizeof(SOCKADDR));

	listen(socketServer, 5);
	printf("服务器已启动:\n监听中...\n");

	SOCKET socketClient;
	SOCKADDR_IN addClient;
	int len = sizeof(SOCKADDR);
	char charsendBuf[100];//发送至客户端的字符串
	char charrecvBuf[100];//接受客户端返回的字符串

	//会阻塞进程,直到有客户端连接上来为止
	socketClient = accept(socketServer, (SOCKADDR*)&addClient, &len);
	//接收并打印客户端数据
	recv(socketClient, charrecvBuf, 100, 0);
	printf("%s\n", charrecvBuf);

	//关闭socket
	closesocket(socketClient);
	WSACleanup();
}



客户端:

#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1
#include <Winsock2.h>
#include <cstdio>
#include <iostream>

#pragma comment(lib,"ws2_32.lib")
int main()
{
	WSADATA wsaData;
	SOCKET sockClient;//客户端Socket
	sockaddr_in addrServer;//服务端地址
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	//新建客户端socket
	sockClient = socket(AF_INET, SOCK_STREAM, 0);
	//定义要连接的服务端地址

	
	addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(6000);//连接端口6000
									  //连接到服务端
	connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
	auto err = GetLastError();
	std::cout << err;
	//发送数据
	char message[20] = "HelloSocket!";
	send(sockClient, message, strlen(message) + 1, 0);
	//关闭socket
	closesocket(sockClient);
	WSACleanup();
    return 0;
}


服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

以下是一个简单的socket实例,它使用TCP协议在本地主机上创建一个服务器,并等待来自客户端的连接: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8080 int main(int argc, char const *argv[]) { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置socket选项,允许重用地址和端口 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt failed"); exit(EXIT_FAILURE); } // 设置socket地址结构 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定socket到指定地址和端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听socket,等待客户端连接 if (listen(server_fd, 3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", PORT); // 接受客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept failed"); exit(EXIT_FAILURE); } // 从客户端读取数据 int valread = read(new_socket, buffer, 1024); printf("Received from client: %s\n", buffer); // 向客户端发送数据 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent to client\n"); // 关闭socket close(new_socket); close(server_fd); return 0; } ``` 运行该程序后,可以使用telnet工具连接到服务器并发送数据: ``` $ telnet localhost 8080 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello from client Hello from server Connection closed by foreign host. ``` 服务器将收到来自客户端的消息“Hello from client”,并发送回消息“Hello from server”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值