免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1907 | 回复: 8
打印 上一主题 下一主题

[函数] socket 的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-14 15:51 |只看该作者 |倒序浏览
连接服务器时,服务器端的accept 返回值是-1 ,提示bad address

从主机名得到的网络地址,主机名我是从 HOSTNAME 这个环境变量得到的。

我是在同一台机器上运行的客户端,和服务器端。请问这个可能是什么问题呢?

论坛徽章:
0
2 [报告]
发表于 2008-11-14 16:01 |只看该作者
LZ贴出代码来,,,,有点笼统

论坛徽章:
0
3 [报告]
发表于 2008-11-17 16:16 |只看该作者

回复 #2 chary8088 的帖子

源代码都是从网上找来的,还有我是虚拟机上运行的。哪位高人帮我看看有什么问题啊


服务器端源码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 35235
#define BACKLOG 10
main()
{
   int sockfd,client_fd;
   struct sockaddr_in my_addr;
   struct sockaddr_in remote_addr;
   
  /* The fllow variables using to file */
  char lineStr[30];
  char recStr[20];
  char headStr[15],tailStr[15];
  char *delim="=";
  FILE *file;
  int flag=0;
   
   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
   {
      perror("socket error";
   exit(1);
   }
   //设置本地socket实例的协议族,连接端口等
   my_addr.sin_family=AF_INET;
   my_addr.sin_port=htons(SERVPORT);
   my_addr.sin_addr.s_addr = INADDR_ANY;
   bzero(&(my_addr.sin_zero),;
   if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
   {
     perror("bind error!";
  exit(1);
   }
  if (listen(sockfd, BACKLOG) == -1)
  {
     perror("listen error!";
     exit(1);
  }
  //监听并处理客户的连接请求
  while(1)
  {
     int sin_size = sizeof(struct sockaddr_in);
     if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
  {
        perror("accept error!";
        continue;
     }
printf("received a connection from %s\n", inet_nto(remote_addr.sin_addr));   
   
//创建子进程,检索目标串并把结果返回个客户端
if (!fork())
{
       int len;
    if((len=recv(client_fd,recStr,30,0))==-1)
    {
       printf("Receive error!\n";
    exit(1);
    }
    recStr[len]='\0';
    file=fopen("server.conf","r";
    printf("Client send: %s\n",recStr);
    while(fgets(lineStr,30,file))
    {
     //以“=”为标记,分别去等号的左边和右边,分别存入headStr和tailStr
     strcpy(headStr,strtok(lineStr,delim));
     strcpy(tailStr,strtok(NULL,delim));
   if(strcmp(headStr,recStr)==0)
   {
     flag=1;
     if(send(client_fd,tailStr,20,0)==-1)
     {
              perror("send error!";
        exit(1);
     }
    /* break; */
    }
  }
  if(flag==0)
    send(client_fd,"Not find",9,0);
   
        close(client_fd);
        exit(0);
    }
    close(client_fd);
   }
}
  
  
  
客户端程序我做了一些改动  ,就是main的入口参数,主要是为了调试方便
  
  
客户端源码:
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 35235
#define MAXDATASIZE 100
main(int argc, char *argv[])
{

argc=3;
argc[1]="localhost.localname";      //我的主机名
argc[2]="name";                            //需要服务器查询的字符串
   int sockfd, recvbytes;
   char buf[MAXDATASIZE];
   struct hostent *host;
   struct sockaddr_in serv_addr;
   if (argc < 3)
   {
     fprintf(stderr,"lease enter the server's hostname and string!\n";
  exit(1);
   }
   if((host=gethostbyname(argv[1]))==NULL)
   {
       herror("gethostbyname砮error!";
       exit(1);
   }
   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
   {
       perror("socket?error!";
       exit(1);
   }
   //设置连接服务器的协议族,端口号,服务器端的地址等
   serv_addr.sin_family=AF_INET;
   serv_addr.sin_port=htons(SERVPORT);
   serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
   bzero(&(serv_addr.sin_zero),;
   if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
   {
      perror("connect?error!");
      exit(1);
   }
   if(send(sockfd,argv[2],20,0)==-1)
   {
       printf("send to server error!\n");
    exit(1);
}
   if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
   {
        perror("recv?error");
        exit(1);
    }
buf[recvbytes] = '\0';
printf("Received: %s\n",buf);
close(sockfd);
}

论坛徽章:
0
4 [报告]
发表于 2008-11-17 16:57 |只看该作者
if((host=gethostbyname(argv[1]))==NULL)
这个参数是错误的!!!gethostbyname 这个是解析域名的,比如你连接是www.baidu.com,这个函数会把域名解析IP地址对应的unsigned long的数值,LZ是在本地的运行的,不需要解析的

论坛徽章:
0
5 [报告]
发表于 2008-11-17 17:06 |只看该作者
而且是LZ的是没有域名,所以改成IP地址,,代码的应该这样改,把gethostbyname 去了
   //设置连接服务器的协议族,端口号,服务器端的地址等
   serv_addr.sin_family=AF_INET;
   serv_addr.sin_port=htons(SERVPORT);
   serv_addr.sin_addr = inet_addr("IP地址");

论坛徽章:
0
6 [报告]
发表于 2008-11-17 17:12 |只看该作者

回复 #4 chary8088 的帖子

在本地也应该解析出本地的地址啊,因为这个错了?那我该怎么写?

论坛徽章:
0
7 [报告]
发表于 2008-11-17 17:37 |只看该作者
都给你写好代码了!!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2008-11-17 17:55 |只看该作者
LZ代码中禁用Smilies一下先

论坛徽章:
0
9 [报告]
发表于 2008-11-18 13:00 |只看该作者

回复 #7 chary8088 的帖子

换了你的方法后,服务器端根本就没反应了。
而且你写的也不太对
应该是serv_addr.sin_addr.s_addr = inet_addr("IP地址");
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP