网络编程:winsocket 和 vmware ubuntu 通信,NAT 非端口映射

本文详细介绍了使用WinSock和Linux Socket实现跨平台网络通信的过程,包括网络配置、客户端和服务端的代码实现,以及如何处理连接、发送和接收数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、网络配置

1、NAT 虚拟网络配置

2、选择 NAT

3、查看ip

4、设置 VMnet8 ,ip自设,网关需要一致。

二、程序

1、WinSocketClient

/* WinSocketClient.cpp */

#include "pch.h"
#include <WINSOCK2.H>
#include <STDIO.H>
#include <iostream>
#include <cstring>
#include <string>
#include <WS2tcpip.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")

#define SERV_IP        "192.168.163.129"  
#define SERV_PORT       6666 

int main()
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsadata;
	if (WSAStartup(sockVersion, &wsadata) != 0)
	{
		return 0;
	}

	SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sclient == INVALID_SOCKET)
	{
		printf("invalid socket!\n");
		return 0;
	}

	sockaddr_in serAddr;
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(SERV_PORT);
	//serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	InetPton(AF_INET, TEXT(SERV_IP), &serAddr.sin_addr.s_addr);

	// 连接
	if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
	{
		printf("connect error !");
		closesocket(sclient);
		return 0;
	}

	string sdata;
	while (cin >> sdata) {
		const char * sendData;
		sendData = sdata.c_str();   //string转const char* 
		send(sclient, sendData, strlen(sendData), 0);
	}	

	closesocket(sclient);

	WSACleanup();
	return 0;

}

2、LinuxSocketServer

/* LinuxSocketServer */

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <string.h>
#include "fcntl.h"
#include "errno.h"

//#define serv_ip     "127.0.0.1"
#define serv_ip     "192.168.163.129"
#define serv_port   6666

int main()
{
	int serv_fd, clie_fd;
	int flags;

	struct sockaddr_in serv_addr, clie_addr;                           //设置服务器地址
	socklen_t clie_addr_len;

	char buf[BUFSIZ];
	char quitbuf[20];
	int n = 0, i = 0;
	char clie_ipbuf[15];
	
	serv_fd = socket(AF_INET, SOCK_STREAM, 0);                          //创建socket

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(serv_port);
	inet_pton(AF_INET, serv_ip, &serv_addr.sin_addr.s_addr);
	//serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	bind(serv_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));   //绑定端口和ip到服务器套接字
	
	listen(serv_fd, 128);                                              //设置最大同时连接数
	clie_addr_len = sizeof(clie_addr);
	clie_fd = accept(serv_fd, (struct sockaddr *)&clie_addr, &clie_addr_len);          //阻塞
	
	printf("client ip: %s, client port: %d\n", inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_ipbuf, (socklen_t)sizeof(clie_ipbuf)), ntohs(clie_addr.sin_port));

	//*
	flags = fcntl(clie_fd, F_GETFL);
	flags |= O_NONBLOCK;
	fcntl(clie_fd, F_SETFL, flags);
	//*/

	while(1)
	{
		//读取
		sleep(1);
		memset(buf, 0, sizeof(buf));
		n = read(clie_fd, buf, sizeof(buf));
		if(n < 0){
			printf("n = %d\n", n);
			switch(errno){
				case EAGAIN: printf("EAGAIN\n");break;
				case EBADF: printf("EBADF\n");break;
				case EFAULT: printf("EFAULT\n");break;
				case EINTR: printf("EINTR\n");break;
				case EINVAL: printf("EINVAL\n");break;
				case EIO: printf("EIO\n");break;
				case EISDIR: printf("EISDIR\n");break;
				default: break;
			}
		}
		else if(n == 0){
			printf("n = %d\n", n);
			break;
		}
		else if(n > 0)
		{
			printf("%s\n", buf);
		}
	}

	close(serv_fd);
	close(clie_fd);

	printf("server close...\n");

	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值