Server發消息,Client接收消息的簡單demo,學習WSocket的原理|windows網絡編程

在這裏插入圖片描述

client.cpp
#include<Winsock2.h>
#include<stdio.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")  //添加庫文件WindowsSocket2.0版本32位,庫是編譯好的二進制代碼
#pragma warning(disable:4996)
//服務器端口號爲5050
#define DEFAULT_PORT  5050
#define DATA_BUFFER   1024
int main(int argc,char *argv[])
{
	WSADATA wsaData;
	SOCKET sClient;
	int iPort = DEFAULT_PORT;  
	int iLen;//從服務器端接收的數據長度
	char buf[DATA_BUFFER];//接收數據的緩衝
	struct sockaddr_in ser;//服務器端地址
	//判斷輸入的參數是否正確
	//if (argc < 2)
	//{
	//	printf("Usage:client[Server IP sddress]\n");
	//	return 0;
	//}
	printf("----------------------------\n");
	printf("client\n");
	printf("----------------------------\n");

	//接收數據的緩衝區初始化
	memset(buf, 0, sizeof(buf));
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		printf("Failed to load Winsock.\n");
		return 0;
	}
	//填寫要連接的服務器地址信息
	ser.sin_family = AF_INET;
	ser.sin_port = htons(iPort);
	ser.sin_addr.s_addr = inet_addr("127.0.0.1");
	//建立客戶端流式套接口
	sClient = socket(AF_INET, SOCK_STREAM, 0);
	if (sClient == INVALID_SOCKET)
	{
		printf("socket( ) Failed:%d\n", WSAGetLastError());
		return 0;
	}
	//請求與服務器端建立TCP連接
	if (connect(sClient, (struct sockaddr*)&ser, sizeof(ser)) == INVALID_SOCKET)
	{
		printf("connect( ) Failed:%d\n", WSAGetLastError());
		return 0;
	}
	else
	{
		printf("連接成功!");
	}

	while (1)
	{
		//從服務器端接收數據
		iLen = recv(sClient, buf, sizeof(buf), 0);
		if (iLen == 0)
			return 0;
		else if (iLen == SOCKET_ERROR)
		{
			printf("recv( ) Failed:%d\n", WSAGetLastError());
			return 0;
		}
		printf("recv( ) data from server:%s\n", buf);
	}
	closesocket(sClient);
	WSACleanup();
	getchar();
	printf("Hello");
	system("pause");
	return 0;
}

server.cpp
#include <WinSock2.h>   //WindowsSocket2.0版本
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <WS2tcpip.h>
#include <string.h>
#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib")  //添加庫文件WindowsSocket2.0版本32位,庫是編譯好的二進制代碼
#define DEFAULT_PORT 5050

int main(void) 
{
	int iPort = DEFAULT_PORT;
	WSADATA wasData;//創建一個結構體
	WORD wdVersion = MAKEWORD(2, 2);
	SOCKET sListen, sAccept;
	int iLen; //客戶地址長度
	int iSend; //發送的數據長度
	char buf[] = "I am a server";  //要發送給客戶的信息
	struct sockaddr_in ser, cli;   //服務器和客戶的地址
	printf("----------------------------\n");
	printf("Server waiting\n");
	printf("----------------------------\n");
	if (WSAStartup(wdVersion, &wasData)!=0)
	{
		printf("Falied to load Winsock.\n");
		return -1;
	}
	//創建服務器端套接口
	sListen = socket(AF_INET, SOCK_STREAM, 0);
	if (sListen == INVALID_SOCKET)
	{
		printf("socket() Failed:%d\n", WSAGetLastError());
		return -1;
	}
	ser.sin_family = AF_INET;  //建立服務器端地址
	ser.sin_port = htons(iPort);  //htons()函數吧一個雙字節主機順序轉換爲網絡字節順序數
	//使用系統指定的IP地址INADDR_ANY
	ser.sin_addr.s_addr = htonl(INADDR_ANY);  //htonl( )函數把一個四字節主機字節順序的數轉換爲網絡字節順序的數
	if (bind(sListen, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR)
	{
		printf("bind( ) Failed: %d\n", WSAGetLastError());
		return -1;
	}
	//進入監聽狀態
	if (listen(sListen, 5) == SOCKET_ERROR)
	{
		printf("listen( ) Failed:%d\n", WSAGetLastError());
		return -1;
	}
	//初始化客戶地址長度參數
	iLen = sizeof(cli);
	//進入一個無限循環,等待客戶的連接請求
	sAccept = accept(sListen, (struct sockaddr*)&cli, &iLen);
	if (sAccept == INVALID_SOCKET)
	{
		printf("accept( ) Failed: %d\n", WSAGetLastError());
		return -1;
	}
	else
	{
		printf("建立連接成功!");
	}
	//輸出客戶IP地址和端口號
	printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
	//給連接的客戶發送信息
	while (1)
	{
		iSend = send(sAccept, buf, sizeof(buf), 0);
		if (iSend == SOCKET_ERROR)
		{
			printf("send( ) Failed.:%d\n", WSAGetLastError());
			break;
		}
		else	if (iSend == 0)
			printf("isend==0");
		//break;
		else
		{
			printf("send( ) byte:%d\n", iSend);
			printf("-------------------------------\n");
		}
		//closesocket(sAccept);
		printf("發送成功,再次輸入消息:");
		//scanf("%s", buf);
		char c = getchar();
		int i = 0;
		while (c != '\n')
		{
			buf[i] = c;
			c = getchar();
		}
		printf("The send data is:%s", buf);
	}
	closesocket(sListen);
	WSACleanup();
	system("pause");
	return 0;
}


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