socket聊天室和netcat通信

socket是在应用层和传输层之间的一个抽象层,socket本质是编程接口(API),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。TCP/IP只是一个协议栈,必须要具体实现,同时还要提供对外的操作接口(API),这就是Socket接口。通过Socket,我们才能使用TCP/IP协议。
在这里插入图片描述

server.cpp
#include <stdio.h>
 #include <windows.h>
 #pragma comment(lib, "ws2_32.lib") 
 SOCKADDR_IN cAddr = { 0 };
 int len = sizeof cAddr;
 SOCKET clientSocket[1024];
 int count = 0;  

void tongxin(int idx)
 {	
        char buff[1024];	
        int r;
 	while (1) 
 	   {		
 	       r = recv(clientSocket[idx], buff, 1023, NULL);		
 	       if (r > 0)
 	        {			
 	        buff[r] = 0;			
 	        printf("%d:%s\n", idx, buff);			//广播数据			
 	        for (int i = 0; i < count; i++)
 	          {		
 	           send(clientSocket[i], buff, strlen(buff), NULL);			
 	          }		
 	    }	
 	   
  } 
  int main()
   {	
   //1 请求协议版本	
   WSADATA wsaData;	
   WSAStartup(MAKEWORD(2, 2), &wsaData);	
   if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {		
    printf("请求协议版本失败!\n");		
    return -1;	
    }	
    printf("请求协议成功!\n");	
    //2 创建socket	
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
    if (SOCKET_ERROR == serverSocket)
     {		
     printf("创建socket失败!\n");		
     WSACleanup();		
     return -2;	
     }	
     printf("创建socket成功!\n"); 	
     //3 创建协议地址族	
     SOCKADDR_IN addr = { 0 };	
     addr.sin_family = AF_INET;//协议版本	
     addr.sin_addr.S_un.S_addr = inet_addr("10.106.69.114");//用自己的ip	        
     addr.sin_port = htons(10086);//0 - 65535     10000左右								   
     //os内核 和其他程序  会占用掉一些端口   80  23   								  
     //4 绑定	
     int r = bind(serverSocket, (sockaddr*)&addr, sizeof addr);	
     if (-1 == r) 
     {		
     printf("bind失败!\n");		
     closesocket(serverSocket);		
     WSACleanup();		
     return -2;	
     }	
     printf("bind成功!\n"); 
     	//5 监听
     		r = listen(serverSocket, 10);	
     		if (-1 == r)
     		 {		
     		 printf("listen失败!\n");		
     		 closesocket(serverSocket);		
     		 WSACleanup();		
     		 return -2;
     		}	
     		printf("listen成功!\n");  	
     //6  等待客户端连接    
     	//客户端协议地址族
     		while (1) 
     		{	
     		clientSocket[count] = accept(serverSocket, (sockaddr*)&cAddr, &len);		
     		if (SOCKET_ERROR == clientSocket[count])
     		 {			
     		 printf("服务器宕机了!\n");			
     		 //8 关闭socket			
     		 closesocket(serverSocket);			
     		 //9 清除协议信息			
     		 WSACleanup();			
     		 return -2;		
     		 }		
     		 printf("有客户端连接到服务器了:%s!\n", inet_ntoa(cAddr.sin_addr)); 		 
     		 CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)tongxin,			
     		 (char*)count, NULL, NULL); 		
     		 count++;	
     		 }	
     		 return 0;
     		 }

``
client.cpp
#include <stdio.h> 
//#include <windows.h>
#include <graphics.h>//easyX
#pragma comment(lib, "ws2_32.lib")
 SOCKET clientSocket;
 HWND hWnd;
 int count = 0; 
 void jieshou() {	
 char recvBuff[1024];	
 int r;
 	while (1) 
 	{		
 	r = recv(clientSocket, recvBuff, 1023, NULL);		
 	if (r > 0)
 	 {			
 	 recvBuff[r] = 0;			
 	 outtextxy(0, count * 20, recvBuff);	
	count++;		
	 }	
	}
	} 
	int main()
	 {	//初始化界面	
	 hWnd = initgraph(300, 400, SHOWCONSOLE); 	
	 //1 请求协议版本	
	 WSADATA wsaData;	
	 WSAStartup(MAKEWORD(2, 2), &wsaData);	
 if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2)
        {		
        printf("请求协议版本失败!\n");		
       return -1;
       	}	
       	printf("请求协议成功!\n");	
       	//2 创建socket	clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
       	if (SOCKET_ERROR == clientSocket)
       	 {		
       	 printf("创建socket失败!\n");		
       	 WSACleanup();		
       	 return -2;
       	}	
       	printf("创建socket成功!\n"); 	
       	//3 获取服务器协议地址族	
       	SOCKADDR_IN addr = { 0 };	
       	addr.sin_family = AF_INET;
       	//协议版本	
       	addr.sin_addr.S_un.S_addr = inet_addr("10.106.69.114");
       	//用自己的ip	addr.sin_port = htons(10086);//0 - 65535  10000左右	   
       	//os内核 和其他程序  会占用掉一些端口   80  23   								   
       	//4 连接服务器
       		int r = connect(clientSocket, (sockaddr*)&addr, sizeof addr);	
       		if (r == -1) 
       		{		
       		printf("连接服务器失败!\n");		
       		return -1;	
       		}	
       		printf("连接服务器成功!\n"); 
       		//5 通信	
       		char buff[1024];	
       		CreateThread(NULL, NULL,(LPTHREAD_START_ROUTINE)jieshou,NULL, NULL, NULL);	
       		while (1) 
       		{		
       		memset(buff, 0, 1024);		
       		printf("你想说啥:");		
       		scanf("%s", buff);		
       		send(clientSocket, buff, strlen(buff), NULL);	
       		}	
       		return 0;
       		}


在这里插入图片描述
校园有线网客户端会限制多网卡,做实验时要用无线网。 创建完网卡后,就把你那两台虚拟机的网络调“仅主机”下面选择你创建的网卡,然后开机,这是你的两台虚拟机就在同一个局域网内,然后给你的两台虚拟机配ip地址,网段必须跟你创建网卡是的一样,你创建网卡的网段是192.168.56.0 ,192.168.56.1这个地址被你的电脑给用了,用来跟虚拟机通信,你虚拟机IP地址范围就是192.168.56.2–192.168.56.254(关掉DHCP的动态分配)
在这里插入图片描述
在这里插入图片描述
同理配置kali,ping同网络就没问题了,nc的话你先把防火墙和SELinux关了效果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矢沢心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值