Win_Sockets_Tcp

a

/*
struct sockaddr_in {
short int sin_family; // 地址族
unsigned short int sin_port; // 端口号
struct in_addr sin_addr; //IP地址
unsigned char sin_zero[8]; //填充0 以保持与struct sockaddr同样大小
};
*/

/*
struct sockaddr {
unsigned short sa_family; ///地址族, AF_xxx
char sa_data[14]; // 14 字节的协议地址
};

*/


Server.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>

using std::cout;
using std::endl;
#define SERVPORT 3333		//----服务器监听端口号
#define BACKLOG 10			//----等待连接队列的最大长度
#pragma comment(lib, "ws2_32.lib")

DWORD WINAPI ClientThread(LPVOID Tmp_CinSocket)
{
	SOCKET CinSocket = (SOCKET)Tmp_CinSocket;

	/*----发送数据----*/
	char* str = "Server: Hello Cliend,You've connected! Please send me something then something!\n";
	if (send(CinSocket, str, strlen(str), 0) == SOCKET_ERROR)
		perror("Server:send出错!");

	/*----循环接收后处理----*/
	puts("Local:\tThe words that've received frome Client's:\n");
	while (true)
	{
		char revData[255];
		int ret = recv(CinSocket, revData, 255, 0);
		if (ret == SOCKET_ERROR)
			{
			    perror("Error with sending data!");
			    break;
			}
		else if (ret == 0)
		{
			cout << "Local:\tClient've ended!\n" << endl;
			break;
		}
		else if (ret > 0)
		{
			revData[ret] = 0x00;
			printf(revData);
		}
	}
	return 0;
}

int main()
{
	/*----初始化WSA----*/
	WSADATA wsaData;								//----wsaData用来存储系统传回的关于WINSOCK的资料.

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)	//----MAKEWORD(2,2)表示使用WINSOCK2版本.
	{												//----MAKEWORD创建一个无符号16位整形,通过连接两个给定的无符号参数
		printf("初始化WSA,出错!");
		exit(1);
	}
	//cout << "IP包最大长度是: " << wsaData.iMaxSockets << std::endl;

	/*----创建服务器Socket----*/
	SOCKET ListenSocket;
	if ((ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
	{
		printf("socket创建出错!");
		exit(1);
	}

	/*----绑定IP和端口----*/
	struct sockaddr_in my_addr;					//----本机地址信息
	my_addr.sin_family = AF_INET;				//----TCP协议族
	my_addr.sin_port = htons(SERVPORT);			//----端口号
	my_addr.sin_addr.s_addr = INADDR_ANY;		//----IP地址.设置.
	memset(my_addr.sin_zero, NULL, 8);			//----string.h中的字符cp置空函数

	if (bind(ListenSocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)	//----也可以!=0即失败
	{
		perror("bind出错!");
		exit(1);
	}

	/*----设置监听,最大连接数----*/
	if (listen(ListenSocket, BACKLOG) == SOCKET_ERROR)												//----也可以!=0或==-1表示失败
	{
		perror("listen出错!");
		exit(1);
	}
	cout << "服务端开始监听!" << std::endl;

	/*----循环处理连接----*/
	struct sockaddr_in CinAdress;				//----接收到的地址
	int CinAdressLength = sizeof(CinAdress);	//----存储接收到的地址长度(Bytes)
	SOCKET CinSocket;							//----接收到的socket
	while (true)
	{	/*----轮询方式,接受完一个开线程处理,并继续调用accept函数等待(若无等到阻塞主线程,到新连接触发继续)----*/
		CinSocket = accept(ListenSocket, (struct sockaddr *)&CinAdress, &CinAdressLength);		//----接受到的,CinAdressLength <= sizeof(struct sockaddr_in),
		if (CinSocket == INVALID_SOCKET)
		{
			perror("accept出错");
			continue;
		}
		printf("Local:\treceived a connection from \n\t%s:%d\n", inet_ntoa(CinAdress.sin_addr), CinAdress.sin_port);

		HANDLE hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CinSocket, 0, NULL);
		if (hThread == NULL)
		{
			cout << "Create Thread Failed!" << endl;
			break;
		}
		CloseHandle(hThread);
	}
	closesocket(ListenSocket);
	closesocket(CinSocket);
	WSACleanup();

	return 0;
}

Client.cpp


#include <WINSOCK2.H>
#include <STDIO.H>
#include<string.h>
#include<iostream>
using namespace std;
#pragma  comment(lib,"ws2_32.lib")
#define Server_Port 3333
#define Server_Address "123.124.2.103"


int main(int argc, char* argv[])
{
    WORD sockVersion = MAKEWORD(2,2);
    WSADATA data;
    if(WSAStartup(sockVersion, &data) != 0)
    {
        printf("WSA Start Error!");
    }

    SOCKET ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(ClientSocket == INVALID_SOCKET)
    {
        printf("invalid ClientSocket !");
        return -1;
    }

    sockaddr_in ServerAddress;
    ServerAddress.sin_family = AF_INET;
    ServerAddress.sin_port = htons(Server_Port);
    ServerAddress.sin_addr.S_un.S_addr = inet_addr(Server_Address);
    if (connect(ClientSocket, (sockaddr *)&ServerAddress, sizeof(ServerAddress)) == SOCKET_ERROR)
    {
        printf("connect Server error !");
        closesocket(ClientSocket);
        return -1;
    }

    char recData[255];
    int ret = recv(ClientSocket, recData, 255, 0);
    if(ret > 0)
    {
        //recData[ret] = 0x00;
        printf(recData);
    }
    char sendData[255] = "Client:\tHello,Server!\n";
    cout<<"Local:\tPlease cin something by someting,with ending of begin next line with # \n";
    while(sendData[0]!='#')
    {
       sendData[strlen(sendData)]=NULL;
       send(ClientSocket, sendData, strlen(sendData), 0);
       cin.getline(sendData,255);
    }

    closesocket(ClientSocket);
    WSACleanup();

    return 0;
}



a



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值