c++ socket TCP/IP互相聊天传输基本的消息

基本的传输消息的,互发消息

服务器

#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {
	//定义长度变量
	int send_len = 0;
	int recv_len = 0;
	int len = 0;
	//定义发送缓冲区和接受缓冲区
	char send_buf[100];
	char recv_buf[100];
	//定义服务端套接字,接受请求套接字
	SOCKET s_server;
	SOCKET s_accept;
	//服务端地址客户端地址
	SOCKADDR_IN server_addr;
	SOCKADDR_IN accept_addr;
	initialization();
	//填充服务端信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  //这里是用的本地ip可自行修改
	server_addr.sin_port = htons(5010);  //v这里的端口号要与client端一致
	//创建套接字
	
	s_server = socket(AF_INET, SOCK_STREAM, 0);
	if (bind(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
		cout << "套接字绑定失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "套接字绑定成功!" << endl;
	}
	//设置套接字为监听状态
	if (listen(s_server, SOMAXCONN) < 0) {
		cout << "设置监听状态失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "设置监听状态成功!" << endl;
	}
	cout << "服务端正在监听连接,请稍候...." << endl;
	//接受连接请求
	len = sizeof(SOCKADDR);
	s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);
	if (s_accept == SOCKET_ERROR) {
		cout << "连接失败!" << endl;
		WSACleanup();
		return 0;
	}
	cout << "连接建立,准备接受数据" << endl;
	//接收数据
	while (1) {
		recv_len = recv(s_accept, recv_buf, 100, 0);
		if (recv_len < 0) {
			cout << "接受失败!" << endl;
			break;
		}
		else {
			cout << "客户端信息:" << recv_buf << endl;
		}
		cout << "请输入回复信息:";
		cin >> send_buf;
		send_len = send(s_accept, send_buf, 100, 0);
		if (send_len < 0) {
			cout << "发送失败!" << endl;
			break;
		}
	}
	//关闭套接字
	closesocket(s_server);
	closesocket(s_accept);
	//释放DLL资源
	WSACleanup();
	return 0;
}
void initialization() {
	//初始化套接字库
	WORD w_req = MAKEWORD(2, 2);//版本号
	WSADATA wsadata;
	int err;
	err = WSAStartup(w_req, &wsadata);
	if (err != 0) {
		cout << "初始化套接字库失败!" << endl;
	}
	else {
		cout << "初始化套接字库成功!" << endl;
	}
	//检测版本号
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
		cout << "套接字库版本号不符!" << endl;
		WSACleanup();
	}
	else {
		cout << "套接字库版本正确!" << endl;
	}
	//填充服务端地址信息

}

客户端


#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {
	//定义长度变量
	int send_len = 0;
	int recv_len = 0;
	//定义发送缓冲区和接受缓冲区
	char send_buf[100];
	char recv_buf[100];
	//定义服务端套接字,接受请求套接字
	SOCKET s_server;
	//服务端地址客户端地址
	SOCKADDR_IN server_addr;
	initialization();
	//填充服务端信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	server_addr.sin_port = htons(5010);
	//创建套接字
	s_server = socket(AF_INET, SOCK_STREAM, 0);
	if (connect(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
		cout << "服务器连接失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "服务器连接成功!" << endl;
	}

	//发送,接收数据
	while (1) {
		cout << "请输入发送信息:";
		cin >> send_buf;
		send_len = send(s_server, send_buf, 100, 0);
		if (send_len < 0) {
			cout << "发送失败!" << endl;
			break;
		}
		recv_len = recv(s_server, recv_buf, 100, 0);
		if (recv_len < 0) {
			cout << "接受失败!" << endl;
			break;
		}
		else {
			cout << "服务端信息:" << recv_buf << endl;
		}

	}
	//关闭套接字
	closesocket(s_server);
	//释放DLL资源
	WSACleanup();
	return 0;
}
void initialization() {
	//初始化套接字库
	WORD w_req = MAKEWORD(2, 2);//版本号
	WSADATA wsadata;
	int err;
	err = WSAStartup(w_req, &wsadata);
	if (err != 0) {
		cout << "初始化套接字库失败!" << endl;
	}
	else {
		cout << "初始化套接字库成功!" << endl;
	}
	//检测版本号
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
		cout << "套接字库版本号不符!" << endl;
		WSACleanup();
	}
	else {
		cout << "套接字库版本正确!" << endl;
	}
	//填充服务端地址信息

}

使用方法,先启董服务器,然后启动客户端就可以了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很好的毕设主题。下面是一个基于TCP/IP的文件传输的简单设计和实现建议,使用VC代码实现: 1. 建立客户端和服务器端的TCP连接。 2. 客户端选择要传输的文件并将其读取到内存中。 3. 客户端将文件大小发送给服务器端。 4. 服务器端接收到文件大小后,分配一个缓冲区来存储接收到的文件。 5. 服务器端发送一个确认消息给客户端,表示已经准备好接收文件。 6. 客户端开始将文件数据分成固定大小的块,并将每个块发送给服务器端。 7. 服务器端接收每个块,并将其存储到缓冲区中。 8. 当客户端发送完整个文件后,它会发送一个文件传输完成的消息给服务器端。 9. 服务器端接收到文件传输完成的消息后,将缓冲区中的数据写入磁盘中,并发送一个确认消息给客户端,表示文件传输完毕。 10. 客户端接收到确认消息后,断开TCP连接。 这是一个基本的文件传输协议的设计和实现,您可以根据需要进行修改和扩展。以下是一个简单的VC代码示例,实现上述协议: ```c++ #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //Winsock Library #define BUF_SIZE 1024 int main(int argc, char* argv[]) { WSADATA wsa; SOCKET s, new_socket; struct sockaddr_in server, client; int c; char* message; char buffer[BUF_SIZE]; int recv_size; FILE* fp; long file_size; long remain_size; long read_size; long write_size; char filename[BUF_SIZE]; printf("\nInitialising Winsock..."); if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("Failed. Error Code : %d", WSAGetLastError()); return 1; } printf("Initialised.\n"); //Create a socket if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("Could not create socket : %d", WSAGetLastError()); } printf("Socket created.\n"); //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(8888); //Bind if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) { printf("Bind failed with error code : %d", WSAGetLastError()); exit(EXIT_FAILURE); } puts("Bind done"); //Listen to incoming connections listen(s, 3); //Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); new_socket = accept(s, (struct sockaddr*)&client, &c); if (new_socket == INVALID_SOCKET) { printf("accept failed with error code : %d", WSAGetLastError()); return 1; } puts("Connection accepted"); //Receive file size memset(buffer, 0, BUF_SIZE); recv_size = recv(new_socket, buffer, BUF_SIZE, 0); file_size = *(long*)buffer; printf("File size: %ld\n", file_size); //Receive file name memset(buffer, 0, BUF_SIZE); recv_size = recv(new_socket, buffer, BUF_SIZE, 0); strcpy(filename, buffer); printf("File name: %s\n", filename); //Open file fp = fopen(filename, "wb+"); if (fp == NULL) { printf("Could not open file %s", filename); exit(EXIT_FAILURE); } //Receive file data remain_size = file_size; while (remain_size > 0) { read_size = BUF_SIZE; if (remain_size < BUF_SIZE) { read_size = remain_size; } memset(buffer, 0, BUF_SIZE); recv_size = recv(new_socket, buffer, read_size, 0); write_size = fwrite(buffer, 1, recv_size, fp); if (write_size != recv_size) { printf("Could not write to file %s", filename); exit(EXIT_FAILURE); } remain_size -= write_size; } printf("File received: %s\n", filename); //Send confirmation message = "File received"; send(new_socket, message, strlen(message), 0); //Close socket and file fclose(fp); closesocket(new_socket); closesocket(s); WSACleanup(); return 0; } ``` 以上代码只是服务器端的实现,客户端的实现类似,但需要从本地读取文件并将其分块发送给服务器端。您可以使用此代码作为参考,进行必要的修改和扩展,以实现您的毕设要求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值