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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章