WinSock之简单的TCP通信程序设计

内容

  编写客户端与服务端程序,客户端与服务端建立TCP连接后:

(1)服务端向客户端发送一条内容为"Connect succeed.Please send a message to me."然后等待接收客户端发送来的一条信息,收到后显示该信息并关闭连接,继续等待其他客户的链接请求。

(2)客户端在与服务器的连接寄建立成功后接收并显示从服务器收到的信息,然后从键盘接收一行信息发送给服务器。

服务端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "WinSock2.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")  //链接WinSock导入库
#define PORT 65432
using namespace std;
int main(int argc, char **argv) {
	WSADATA wsaData;
	WORD wVersionRequested = MAKEWORD(2, 2);   //调用2.2版本
	WSAStartup(wVersionRequested, &wsaData);
	
	SOCKET sock_server, newsock;   //监听套接字,已连接套接字
	struct sockaddr_in addr;       //填写绑定地址
	struct sockaddr_in client_addr;  //接收客户端发来的信息
	char msgbuffer[256];
	char msg[] = "Connect succeed.\n";  //发给客户端的信息

	//创建套接字
	sock_server = socket(AF_INET, SOCK_STREAM, 0);

	//填写要绑定的地址
	int addr_len = sizeof(struct sockaddr_in);
	memset((void*)&addr, 0, addr_len);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);   //允许本机的任何IP地址
	
	//给监听套接字绑定地址
	bind(sock_server, (struct sockaddr *)&addr, sizeof(addr));

	//将套接字设为监听状态
	listen(sock_server, 0);
	cout << "listenning......\n";
	
	//接收连接请求并收发数据
	int size;
	while (true) {
		newsock = accept(sock_server, (struct sockaddr *)&client_addr, &addr_len);  //接收请求
	    cout << "成功接受一个连接请求!\n";
		size = send(newsock, msg, sizeof(msg), 0);  //给客户端发送一段信息
		if (size == SOCKET_ERROR) {
			cout << "发送信息失败!错误代码:" << WSAGetLastError() << endl;
			closesocket(newsock);
			continue;
		}
		else if (size == 0) {
			cout << "对方已关闭连接!\n";
			closesocket(newsock);
		    continue;
		}
		else {
			cout << "信息发送成功!\n";
		}
		size = recv(newsock, msgbuffer, sizeof(msgbuffer), 0);
		if (size == 0) {
			cout << "对方已关闭链接!\n";
			closesocket(newsock);
			continue;
		}
		else {
			cout << "收到的消息为:" << msgbuffer << endl;
			closesocket(newsock);
		}
	}
	closesocket(sock_server);
	WSACleanup();
	return 0;
}

客户端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "WinSock2.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")  //链接WinSock导入库
#define PORT 65432
using namespace std;
int main(int argc, char **argv) {
	WSADATA wsaData;
	WORD wVersionRequested = MAKEWORD(2, 2);   //调用2.2版本
	WSAStartup(wVersionRequested, &wsaData);
	
	int sock_client;
	struct sockaddr_in server_addr;
	int addr_len = sizeof(struct sockaddr_in);
	char msgbuffer[1000];

	//创建套接字
	sock_client = socket(AF_INET, SOCK_STREAM, 0);
	
	//填写服务器地址
	char IP[20];
	cout << "请输入服务器IP地址:";
	cin >> IP;
	memset((void *)&server_addr, 0, addr_len);
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = inet_addr(IP);  //填写服务器IP地址

	//连接
	connect(sock_client, (struct sockaddr *)&server_addr, addr_len);

	//接收信息
	int size;
	size = recv(sock_client, msgbuffer, sizeof(msgbuffer), 0);
	if (size == 0) {
		cout << "对方已关闭连接!\n";
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}
	else {
		cout << "The message from Server:" << msgbuffer << endl;
	}

	//发送
	cout << "从键盘输入发给服务器的信息!\n";
	cin >> msgbuffer;
	size = send(sock_client, msgbuffer, sizeof(msgbuffer), 0);
	if (size == 0) {
		cout << "对方已关闭链接!\n";
	}
	else {
		cout << "信息发送成功!\n";
	}

	closesocket(sock_client);
	WSACleanup();
	return 0;
}

结果

  服务端:

  

  客户端:

  

完整代码


/*****服务端*****/

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "WinSock2.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")  //链接WinSock导入库
#define PORT 65432
using namespace std;
int main(int argc, char **argv) {
	WSADATA wsaData;
	WORD wVersionRequested = MAKEWORD(2, 2);   //调用2.2版本
	if (WSAStartup(wVersionRequested, &wsaData) != 0) {   //加载WinSock动态链接库
		cout << "加载WinSock DLL失败!\n";
		return 0;
	}
	int sock_client;
	struct sockaddr_in server_addr;
	int addr_len = sizeof(struct sockaddr_in);
	char msgbuffer[1000];

	//创建套接字
	if ((sock_client = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		cout << "创建套接字失败!错误代码:" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}

	//填写服务器地址
	char IP[20];
	cout << "请输入服务器IP地址:";
	cin >> IP;
	memset((void *)&server_addr, 0, addr_len);
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = inet_addr(IP);  //填写服务器IP地址

	if (connect(sock_client, (struct sockaddr *)&server_addr, addr_len) != 0) {
		cout << "连接失败!错误代码:" << WSAGetLastError();
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}

	//接收信息
	int size;
	if ((size = recv(sock_client, msgbuffer, sizeof(msgbuffer), 0)) < 0) {
		cout << "接受信息失败!错误代码:" << WSAGetLastError();
		WSACleanup();
		return 0;
	}

	else if (size == 0) {
		cout << "对方已关闭连接!\n";
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}
	else {
		cout << "The message from Server:" << msgbuffer << endl;
	}

	cout << "从键盘输入发给服务器的信息!\n";
	cin >> msgbuffer;
	if ((size = send(sock_client, msgbuffer, sizeof(msgbuffer), 0)) < 0) {
		cout << "发送信息失败!错误代码:" << WSAGetLastError() << endl;
	}
	else if (size == 0) {
		cout << "对方已关闭链接!\n";
	}
	else {
		cout << "信息发送成功!\n";
	}
	closesocket(sock_client);
	WSACleanup();
	return 0;
}





/*****客户端*****/

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "WinSock2.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")  //链接WinSock导入库
#define PORT 65432
using namespace std;
int main(int argc, char **argv) {
	WSADATA wsaData;
	WORD wVersionRequested = MAKEWORD(2, 2);   //调用2.2版本
	if (WSAStartup(wVersionRequested, &wsaData) != 0) {   //加载WinSock动态链接库
		cout << "加载WinSock DLL失败!\n";
		return 0;
	}
	int sock_client;
	struct sockaddr_in server_addr;
	int addr_len = sizeof(struct sockaddr_in);
	char msgbuffer[1000];

	//创建套接字
	if ((sock_client = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		cout << "创建套接字失败!错误代码:" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}

	//填写服务器地址
	char IP[20];
	cout << "请输入服务器IP地址:";
	cin >> IP;
	memset((void *)&server_addr, 0, addr_len);
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = inet_addr(IP);  //填写服务器IP地址

	if (connect(sock_client, (struct sockaddr *)&server_addr, addr_len) != 0) {
		cout << "连接失败!错误代码:" << WSAGetLastError();
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}

	//接收信息
	int size;
	if ((size = recv(sock_client, msgbuffer, sizeof(msgbuffer), 0)) < 0) {
		cout << "接受信息失败!错误代码:" << WSAGetLastError();
		WSACleanup();
		return 0;
	}

	else if (size == 0) {
		cout << "对方已关闭连接!\n";
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}
	else {
		cout << "The message from Server:" << msgbuffer << endl;
	}

	cout << "从键盘输入发给服务器的信息!\n";
	cin >> msgbuffer;
	if ((size = send(sock_client, msgbuffer, sizeof(msgbuffer), 0)) < 0) {
		cout << "发送信息失败!错误代码:" << WSAGetLastError() << endl;
	}
	else if (size == 0) {
		cout << "对方已关闭链接!\n";
	}
	else {
		cout << "信息发送成功!\n";
	}
	closesocket(sock_client);
	WSACleanup();
	return 0;
}

 

发布了37 篇原创文章 · 获赞 11 · 访问量 4781
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章