虚拟tcp服务器工具,一个简单的TCP服务器和客户端程序

7b3af8cb39fa

模式示意图

两台物理宿主机,运行Windows10操作系统,在同一个网段之下

每个宿主机中运行着Vmware Station的虚拟机,操作系统为Ubuntu

两个虚拟机分别运行着客户端程序和服务器端程序

客户端程序如下(来自Unix网络编程,Vol1):

/*client.c*/

#include

#include

#include

#include

#include

#include

#include

#define MAXLINE 100

#define bzero(ptr,n) memset(ptr, 0, n)

int main(int argc, char **argv)

{

int sockfd,n;

char recvline[MAXLINE + 1];

struct sockaddr_in servaddr;

if (argc != 2){

printf("usage: a.out \n");

exit(1);

}

if ( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){

printf("socket error\n");

exit(2);

}

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(8889); /*访问服务器的8889号端口*/

if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){

printf("inet_pton error for %s\n", argv[1]);

exit(1);

}

if ((n=connect(sockfd,(const struct sockaddr *) &servaddr, sizeof(servaddr)) )< 0){

printf("connect error\n");

exit(1);

}

while ((n = read(sockfd, recvline, MAXLINE)) > 0) {

recvline[n] = 0; /* null terminate */

if (fputs(recvline, stdout) == EOF){

printf("fputs error\n");

exit(1);

}

}

printf("finally n=%d",n);

if (n < 0)

printf("read error");

exit(0);

}

服务器程序如下(来自Unix网络编程,Vol1):

/*server.c*/

#include

#include

#include

#include

#include

#include

#include

#define MAXLINE 300

#define bzero(ptr,n) memset(ptr, 0, n)

int

main(int argc, char **argv)

{

int listenfd, connfd;

struct sockaddr_in servaddr;

char buff[MAXLINE]="HTTP/1.1 200 OK\r\nContent-type:text/html\r\nContent-length:21\r\n\r\nbonjour tout le monde";

listenfd = socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family=AF_INET;

servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

servaddr.sin_port=htons(8889); /* 服务器监听8889号端口 */

bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

listen(listenfd, 8);

while(1) {

connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);

write(connfd, buff, strlen(buff));

close(connfd);

}

}

代码编译后运行如下:

服务器:./server

客户端:./client 192.168.3.13 (即宿主机2的IP地址)

宿主机2可以直接通过192.168.126.130:8889来访问虚拟机2的服务器,但是对于外部机,如宿主机2是无法直接访问服务器的。首先需要做一个端口映射,把虚拟机的8889号端口映射到宿主机的8889号端口上(或其他可用端口)

7b3af8cb39fa

此外如果宿主机2还是无法访问服务器虚拟机2,可能还需要在虚拟机上防火墙开放8889端口,在Ubuntu系统上可以使用

sudo /sbin/iptables -I INPUT -p tcp --dport 8889 -j ACCEPT

sudo iptables-save

现在在宿主机2的浏览器上输入192.168.126.130:8889就能显示出结果:

7b3af8cb39fa

现在如果在宿主机1的客户端虚拟机上无法访问服务器,可能还需要开启宿主机2防火墙的8889号端口。Windows10上的高级防火墙新建入站规则,并添加8889号端口的允许,以及其他的一些设置。现在客户端应该能得到如下结果

Content-type:text/html

Content-length:21

bonjour tout le monde

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值