LinuxSir.cn,穿越时空的Linuxsir!

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

tcp socker 服务器编程问题,请进来看看。

[复制链接]
发表于 2003-9-25 16:45:39 | 显示全部楼层 |阅读模式
我已经写了server的程序,能开一个端口1234,并且连接成功。
但是我不知道怎么样能简单地分析出http 请求的包,我将请求都放在
buf中,请各我帮我出点子把method=GET,HTTP version=1.0等写出来。
还有一个读写主目录index.htm的问题,应该怎么做,请指点。
源代码如下:
/*tcp server sample*/
#include <stdio.h> /*There are the usual header files*/
#include <string.h>/*for bzero()*/
#include /*for close()*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/stat.h>

#define PORT 1234 /*Port that will be opened*/
#define BACKLOG 1 /*Number of allowed connections*/

main()
{
int listenfd,connectfd; /*socket descriptors*/
struct sockaddr_in server; /*server's address information*/
struct sockaddr_in client; /*client's address information*/
int sin_size;
int n;


char buf[8192];

/*Create a TCP socket*/
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
/*handle exception*/
perror("Creating socket failed.");
exit(1);
}

/*set socket can be used*/
int opt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

bzero(&server,sizeof(server)); /*fill server with 0s*/
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1){
/*handle exception*/
perror("Bind error.");
exit(1);
}

if(listen(listenfd,BACKLOG)==-1){/*calls listen()*/
perror("listen() error\n");
exit(1);
}

sin_size=sizeof(struct sockaddr_in);
if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1){
/*calls accept()*/
perror("accept() error\n");
exit(1);
}

/*printf client's IP*/
printf("You got a connetion from %s\n",inet_ntoa(client.sin_addr));
/*send to the client welcome message*/
send(connectfd,"Welcome to my server.\n",22,0);

read(connectfd, buf, 8192);
printf("%s", buf);
close(connectfd); /*close connectfd*/
close(listenfd); /*close listenfd*/
}
谢谢!!
发表于 2003-9-25 17:48:58 | 显示全部楼层
read(connectfd, buf, 8192);以后可以用strtok之类的函数把得到的缓冲分成词,或者用strstr查找"GET"之类的,
读写index.html直接用open、read就行。

简单的输出index.html:

  1. int fd;
  2. char buf2[8192];
  3. int n;

  4. if((fd = open("index.html", O_RDONLY)) < 0)
  5.   fprintf(stderr, "cannot open index.html\n");
  6. else{
  7.   while((n = read(fd, buf2, 8192)) > 0)
  8.     if(write(connectfd, buf2, n) != n)
  9.       fprintf(stderr, "write error\n");
  10.   if(n < 0)
  11.     fprintf(stderr, "read error\n");
  12.   close(fd);
  13. }
复制代码
 楼主| 发表于 2003-9-25 18:07:08 | 显示全部楼层
其实我的问题简化一下就是要一个能分析http_request的代码。
我已经获得GET / HTTP/1.1的值,并将它存储在变量LINE中,但是我不知道怎么获得GET值,也就是要几句代码能遇到空格时,返回前面的字符串。请指点,也谢谢以上的答复。
发表于 2003-9-25 18:29:35 | 显示全部楼层

  1. char *t1, *t2, *t3;

  2. n = read(connectfd, buf, 8192);
  3. buf[n] = 0;
  4. t1 = strtok(buf, " ");
  5. t2 = strtok(NULL, " ");
  6. t3 = strtok(NULL, " ");
复制代码

strtok的第二个参数是分隔符,可以是几个字符,
strtok会改变buf,把一个词后面的分隔符变成'\0',必要的时候保存buf
 楼主| 发表于 2003-9-25 19:55:03 | 显示全部楼层
谢谢libinary,您真得很负责。
有问题我再问您!再次谢谢!
发表于 2003-10-3 10:28:23 | 显示全部楼层
我的系统是REDHAT9.0

我用man的在线帮助怎么找不到那个   strtok  函数呢?
 楼主| 发表于 2003-10-3 10:54:11 | 显示全部楼层
man 3 string就可以看到了。
发表于 2003-10-3 11:06:33 | 显示全部楼层
我找到了.............

不过 man 3 strtok

还是看不到它的在线帮助,这是怎么回事?

请兄弟指点一下
 楼主| 发表于 2003-10-3 11:35:49 | 显示全部楼层
可能是由于你设置成区域为中文的缘故,我这边也一样。
不过,你可以把区域改一下试试,或者用google.com
搜索man strtok,还是看网页好了,这样工作量少一点。
发表于 2003-10-3 12:05:43 | 显示全部楼层
谢谢楼上的兄弟,我在网上找到了!

不过,效果并不是像我想像的那么好,函数执行后,会破坏缓冲区的内容了

我想,读入一个字符串,以 '\n' 结尾的

我只能自己编函数处理吗?:help
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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