QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 859|回复: 9

请看这段c语言写的网络程须

[复制链接]
发表于 2004-4-16 17:31:23 | 显示全部楼层 |阅读模式
#include<stdio.h>
#include<unistd.h>
#include&lt;stdlib.h&gt;
#include&lt;errno.h&gt;
#include&lt;string.h&gt;
#include&lt;time.h&gt;
#include&lt;sys/socket.h&gt;
#include&lt;sys/types.h&gt;
#include&lt;netinet/in.h&gt;
#include&lt;arpa/inet.h&gt;


int main(int argc,char **argv){
  int z;
  char *srvr_addr=NULL;
  struct sockaddr_in adr_inet;
  struct sockaddr_in adr_clnt;
  int len_inet;
  int s;
  char dgram[512];
  
  srvr_addr="202.197.242.221";
  

  s=socket(AF_INET,SOCK_DGRAM,0);

  if(s==-1) printf("create error.\n");
  else printf("create success\n");

  memset(&amp;adr_inet,0,sizeof(adr_inet));
  adr_inet.sin_family=AF_INET;
  adr_inet.sin_port=htons(9014);
  adr_inet.sin_addr.s_addr=inet_addr(srvr_addr);

  len_inet=sizeof(adr_inet);

  z=bind(s,(struct sockaddr *)&amp;adr_inet,len_inet);
  if(z==-1) printf("bind error");
   printf("bind success!");

  
if(1){
  
  printf("this is before recvfrom.\n");  //为何去除该行,程序就不能运行??

  z=recvfrom(s,dgram,sizeof(dgram),0,(struct sockaddr *)&amp;adr_clnt,&amp;len_inet);
  if(z&lt;0) printf("recvfrom is error.\n");

printf("this is after recvfrom.\n");

  // printf("the client address is %s.",adr_clnt.sin_addr.s_addr);
  dgram[z]='\0';
  
   printf("messgge from client :%s.\n",dgram);

  
   z=sendto(s,dgram,strlen(dgram),0,(struct sockaddr *)&amp;adr_clnt,len_inet);
     if(z&lt;0) printf("sendto is error.\n");
}

  close(s);
  return 0;
}
发表于 2004-4-17 11:17:53 | 显示全部楼层
不能运行j是什么意思?
你贴出两种情况的信息来看看。
回复

使用道具 举报

 楼主| 发表于 2004-4-17 15:45:25 | 显示全部楼层
如果在程序中包含了   printf("this is before recvfrom.\n");  就能正常运行,等待来自客户端的信息.显示如下:
create success
bind success!waiting...


若把 printf("this is before recvfrom.\n"); 从程序中删除,运行的结果如下:
create success

似乎只运行到创建套接口,而没有执行到bind().

请指教!
回复

使用道具 举报

发表于 2004-4-17 17:14:37 | 显示全部楼层
将printf("bind successful");改成printf("bind successful!\n");

btw:建议使用gdb或ddd这样的图形化的调试工具跟踪一下
回复

使用道具 举报

发表于 2004-4-17 18:03:44 | 显示全部楼层
不会吧,还有这种事,一个printf就能有如此大的影响,你再仔细看看代码或重贴一遍。
还有你的wait....是从哪里来的?没有这个语句啊?
还有,用你的程序,我再写了一个客户,能正常运行啊(加上你说的那个printf)
回复

使用道具 举报

 楼主| 发表于 2004-4-20 16:31:47 | 显示全部楼层
问题是少了这个printf语句,这个服务器程序就不能正常运行啊?
回复

使用道具 举报

发表于 2004-4-20 16:40:17 | 显示全部楼层
对不起,说错了,是去掉那个printf也能运行,说说你那个wait?
还有你的那个
if(z==-1) printf("bind error");
printf("bind success!");
你看是不是不正确(有两个bug)?
我想如果你写一个客户端就可以看到原因了。
[code:1]
#include &lt;stdio.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;netdb.h&gt;
int port = 9014;

int
main&#40;&#41;&#123;
  int sockfd;
  char sendbuf &#91;&#93;= &quot;hello&quot;;
  char recvbuf &#91;128&#93;;
  struct sockaddr_in addr;
  
  sockfd = socket &#40;AF_INET,SOCK_DGRAM,0&#41;;
  if&#40; -1 == sockfd&#41; &#123;
    printf&#40;&quot;opening error!\n&quot;&#41;;
    exit&#40;1&#41;;
  &#125;
  memset&#40;&amp;addr,0,sizeof&#40;addr&#41;&#41;;
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr&#40;&quot;你的ip!!!!!!&quot;&#41;;
  addr.sin_port = htons&#40;port&#41;;

  sendto &#40;sockfd,sendbuf,sizeof&#40;sendbuf&#41;+1,0,&#40;struct sockaddr*&#41;&amp;addr,sizeof&#40;addr&#41;&#41;;
  close&#40;sockfd&#41;;

&#125;
[/code:1]
因为printf不加\n就表示不输出新行,这时,处于行缓冲模式的标准输入输出函数只会在有新行符时将缓冲区的内容输出。所以你有了那个if中的第一个pirntf(带\n)就可以看到bind sucess,没有就看不到,其实它在缓冲里。你用client试试在
printf("bind success!\n");
后有无\n的区别。
回复

使用道具 举报

 楼主| 发表于 2004-4-21 20:20:44 | 显示全部楼层
谢谢各位!sagaeon你说的没错,是新行符的问题!!

那条waiting...语句是多余的,是我printf打出来,后来我在程序中把这条语句删了,发贴子时忘了改输出结果.
回复

使用道具 举报

发表于 2004-4-21 22:34:22 | 显示全部楼层
建议不要用printf,在网络程序中最好使用perror,小建议
回复

使用道具 举报

 楼主| 发表于 2004-4-22 10:54:28 | 显示全部楼层
有道理,谢谢!
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 10:56 , Processed in 0.046818 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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