LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 805|回复: 2

TCP/IP程序中 字符串的问题

[复制链接]
发表于 2005-6-24 10:15:56 | 显示全部楼层 |阅读模式
本人正在做一个TCP/IP程序,程序向服务器发出HTTP请求,取得返回内容,目的是测试自己的网站。由终端输入字符串,发送到服务器,之后服务器可返回请求文件的内容。下面一段程序是可以正常运行的,但是对要发送的字符串进行初始化定义,直接发送则不可以,服务器未返回内容。

    下面是由终端进行输入的程序:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXSIZE 2000

void str_cli(FILE *fp, int sockfd)  /*由终端输入字符串,发送到服务器*/
{
        char sends[MAXSIZE], recvs[MAXSIZE];
        int n=0;
        while ( fgets(sends,MAXSIZE,fp)!= NULL)
        {
                send(sockfd,sends,strlen(sends),0);
                printf("\nsends --->%s",sends);
                if ( (n=recv(sockfd,recvs,MAXSIZE,0)) == 0 )
                {
                        printf("\nerror receiving data");
                        exit(1);
                }
                recvs[n]=0;
                fputs(recvs,stdout);
        }
}

int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;

if(argc!=3)
{
  printf("Usage%s hostname portnumber\a\n",argv[0]);
  exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
        printf("Gethostname error\n");
        exit(1);
}
if((portnumber=atoi(argv[2]))<0)
{
        printf("Usage%s hostname portnumber\a\n",argv[0]);
        exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
        printf("Socket Error%s\a\n",strerror(errno));
        exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
  printf("Connect Error%s\a\n",strerror(errno));
  exit(1);
}
/*已建立连接*/
str_cli(stdin,sockfd);  /*处理操作*/

close(sockfd);
exit(0);
}

文件名myclient
程序操作:   myclient localhost 80
建立连接后输入    GET /index.html
程序返回index.html文件内容。

之后把str_cli中的字符串进行初始化,发送给服务器。
void str_cli(FILE *fp, int sockfd)  /*由终端输入字符串,发送到服务器*/
{
        char sends[MAXSIZE], recvs[MAXSIZE];
        char pp[MAXSIZE]="GET /index.html";
        int n=0;
        while ( fgets(sends,MAXSIZE,fp)!= NULL)
        {
                send(sockfd,pp,strlen(pp),0);

                printf("\nsends --->%s",sends);
                if ( (n=recv(sockfd,recvs,MAXSIZE,0)) == 0 )
                {
                        printf("\nerror receiving data");
                        exit(1);
                }
                recvs[n]=0;
                fputs(recvs,stdout);
        }
}
结果程序的反应是未出现页面结果,而是等待下一步的输入。
如果采用strcpy(sends,pp) 把sends拷贝到pp中,则程序运行正确。
     那么由终端输入的字符串与自己编写的字符串是否有某些区别,为什么会有这样的结果。
    还请指教,THANKS.
发表于 2005-6-24 10:55:39 | 显示全部楼层
你所说的现象在我这里没有发生。
这是我运行的结果:

  1. bash-2.05b$ ./a.out www.linuxsir.cn 80
  2. GET /logo.gif

  3. sends --->GET /logo.gif
  4. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  5. <html><head>
  6. <title>404 Not Found</title>
  7. </head><body>
  8. <h1>Not Found</h1>
  9. <p>The requested URL /logo.gif was not found on this server.</p>
  10. <hr />
  11. <address>Apache/2.0.51 (Unix) PHP/4.3.11 Server at www.linuxsir.cn Port 80</address>
  12. </body></html>
复制代码

你再仔细检查一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-24 22:33:29 | 显示全部楼层
首先要感谢你帮我测试程序,上半部的程序由终端输入字符,是可以运行的。我写得很匆忙,在更改的函数中只加入一个初始化的pp,然后 send(sockfd,pp,strlen(pp),0);也就是这时发送给服务器的字符串与终端的输入是没有关系了。不知道你是不是使用下半部分更改过的函数。我用的是Fedora2,不知和系统有没有关系。
      今天试了一上午,终于发现,在设定的字符串后面加上\n 就可以了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表