自己测的socket。学习笔记

来源:互联网 发布:狮王红包软件 编辑:程序博客网 时间:2024/06/03 02:37

测了好久,终于测通了,共测了两种情况!

第一种情况:自己给自己发。配置: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;
}