测了好久,终于测通了,共测了两种情况!
第一种情况:自己给自己发。配置:client和server的ip都设置成同一个ip,本人测试过程中使用的是127.0.0.1.其他的不变。
第二种情况:分别把client和server放在两个虚拟机里。这里关于虚拟机里的设置搞死人额,也许自己关于虚拟机还不熟悉,所以就关于虚拟机设置,相互之间可以ping通,和外面机器也可以ping 通,我熬了一个通宵,总算是搞通了!
用自己的话总结下:外面的机器和虚拟机VMnet8,VMnet1都在一个网段,两个虚拟机里的ip也和他们三个在一个网段,检测一下,最后他们几个都可以相互ping通。
这里有一个至关重要的问题就是一定要把虚拟机里的防火墙关闭掉,事实上防火墙是可以找到的,而我因为找虚拟机防火墙却花了好长时间,最后不得不使用命令,有关关闭虚拟机防火墙的命令,在我的博客中有提到,有需要的可以找找看!
由于自己关于socket还不是很熟悉,有些代码没有搞明白,但是我测试通是在用了把ip写死!用到的函数是inet_addr(),头文件时<arpa/inet.h>
代码如下:
服务端:
/*
* sever.c
*
* Created on: Aug 23, 2012
* Author: cyf
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>//add by cuiyifang to state inet_ntoa.
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3649 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
int main()
{
int sockfd,client_fd,sin_size; /*sock_fd:监听socket;client_fd:数据传输socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
fprintf(stderr,"remote_addr.sin_port=%d\n",remote_addr.sin_port);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
fprintf(stderr,"sockfd=%d\n",sockfd);
//if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
if (sockfd == -1)
{
perror("socket创建出错!");
exit(1);
}
fprintf(stderr,"remote_addr.sin_port=%d\n",remote_addr.sin_port);
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr =INADDR_ANY;//inet_addr("127.0.0.1");//
bzero(&(my_addr.sin_zero),8);
fprintf(stderr,"remote_addr.sin_port=%d\n",remote_addr.sin_port);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind出错!");
exit(1);
}
fprintf(stderr,"bind success!");
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen出错!");
exit(1);
}
fprintf(stderr,"listen success!");
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror("accept出错");
continue;
}
fprintf(stderr,"accept success!");
printf("received a connection from %s ", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子进程代码段 */
if (send(client_fd, "Hello, you are connected! ", 26, 0) == -1)
perror("send出错!");
close(client_fd);
exit(0);
}
close(client_fd);
}
return 0;
}
客户端
/*
* client.c
*
* Created on: Aug 22, 2012
* Author: sean
*/
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <unistd.h> //add by cuiyifang to state function close().
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define SERVPORT 3649
#define MAXDATASIZE 100 /*每次最大数据传输量 */
//#define host 192.168.4.87
int main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct sockaddr_in my_addr;
//struct hostent *host;
struct sockaddr_in serv_addr;
//struct serv_addr;
/*if (argc < 2)
{
fprintf(stderr,"Please enter the server's host name! ");
}
else
exit(1);*/
//host=gethostbyname(argv[1]);
/*host=gethostbyname(argv[1]);
fprintf(stderr,"%s",argv[1]);*/
/*if((host=gethostbyname(argv[1]))==NULL)
{
herror("get host by name 出错!");
exit(1);
}
else
fprintf(stderr,"getname success!");*/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket创建出错!");
exit(1);
}
fprintf(stderr,"socket build success!");
my_addr.sin_family=AF_INET;
my_addr.sin_port=0;
my_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in)) == -1)
{
perror("bind出错!");
exit(1);
}
fprintf(stderr,"bind sucess!");
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
//serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // (struct sockaddr *)&serv_addr
serv_addr.sin_addr.s_addr=inet_addr("192.168.4.129");
//serv_addr.sin_addr = h_addr;
//serv_addr.sin_addr = *(host);
bzero(&(serv_addr.sin_zero),8);
//fprintf(stderr,"bind sucess!");
if (connect(sockfd,(struct sockaddr *)&serv_addr ,sizeof(struct sockaddr_in)) == -1)
{
perror("connect出错!");
exit(1);
}
fprintf(stderr,"connet success!");
if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出错!");
exit(1);
}
fprintf(stderr,"recv success!");
//buf[recvbytes] = "\0";
buf[recvbytes] = 0;
//printf("Received: %s",buf);
fprintf(stderr,"Received : %s",buf);
close(sockfd);
return 0;
}