一、网络配置
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;
}