GCC真的很强大,这几天调试UDP socket的程序总下意识的以为GCC调试的时候不能接受标准输入,这让我很为难,刚才正巧外面闪电,我于是先用一个小程序试一试,果然推翻我原来浅薄想法:
#include<stdio.h> int main() { int i; scanf("%d",&i); printf("get number is: %d\n",i); return 0; }
在ubuntu 11.10 下打开终端,用GDB调试:
(gdb) file try.debug Reading symbols from /home/kl/code/2/try.debug...done. (gdb) l 1 #include<stdio.h> 2 3 int main() 4 { 5 int i; 6 scanf("%d",&i); 7 printf("get number is: %d\n",i); 8 return 0; 9 } (gdb) break 6 Breakpoint 1 at 0x804843d: file try.c, line 6. (gdb) break 7 Breakpoint 2 at 0x8048452: file try.c, line 7. (gdb) run Starting program: /home/kl/code/2/try.debug Breakpoint 1, main () at try.c:6 6 scanf("%d",&i); (gdb) print i $1 = 2797556 (gdb) next 1234 Breakpoint 2, main () at try.c:7 7 printf("get number is: %d\n",i); (gdb) print i $2 = 1234 (gdb)
在(gdb)模式下,输入next在跳到下一个中断之前会给输入的机会,用print函数证实如上,真的很开心,但翻过头来想,自己又是这么初级。。。于是,我又以这种想法再次调试我的UDP socket程序:
(gdb) file udps.debug Reading symbols from /home/kl/code/2/udps.debug...done. (gdb) l warning: Source file is more recent than executable. 2 #include<netinet/in.h> 3 #include<arpa/inet.h> 4 #include<unistd.h> 5 #include<sys/types.h> 6 #include<sys/socket.h> 7 8 #define lport 4567 9 #define lip "127.0.0.1" 10 int main() 11 { (gdb) 12 int mysock,len; 13 struct sockaddr_in addr; 14 int i=0; 15 char msg[256]; 16 17 int addr_len; 18 19 if((mysock=socket(AF_INET,SOCK_DGRAM,0))<0) 20 { 21 perror("error"); (gdb) 22 exit(1); 23 } 24 else 25 { 26 printf("socket created.\n"); 27 printf("socket ID: %d\n",mysock); 28 } 29 addr_len=sizeof(struct sockaddr_in); 30 bzero(&addr,sizeof(addr)); 31 addr.sin_family=AF_INET; (gdb) 32 addr.sin_port=htons(lport); 33 addr.sin_addr.s_addr=inet_addr(lip); 34 35 if(bind(mysock,&addr,sizeof(addr))<0) 36 { 37 perror("connect"); 38 exit(1); 39 } 40 else 41 { (gdb) 42 printf("bind ok.\n"); 43 printf("local port: %d\n",lport); 44 } 45 while(1) 46 { 47 bzero(msg,sizeof(msg)); 48 len=recvfrom (mysock,msg,sizeof(msg),0,&addr,&addr_len); 49 50 printf("%d: ",i); 51 i++; (gdb) 52 printf("message form: %s\n",inet_ntoa(addr.sin_addr)); 53 printf("message: %s\n\n",msg); 54 sendto(mysock,msg,len,0,&addr,addr_len); 55 } 56 return 0; 57 } (gdb) break 48 Breakpoint 1 at 0x8048716: file udps.c, line 48. (gdb) break 50 Breakpoint 2 at 0x8048751: file udps.c, line 50. (gdb) break 52 Breakpoint 3 at 0x804876b: file udps.c, line 52. (gdb) break 53 Breakpoint 4 at 0x804878b: file udps.c, line 53. (gdb) run Starting program: /home/kl/code/2/udps.debug socket created. socket ID: 7 bind ok. local port: 4567 Breakpoint 1, main () at udps.c:48 48 len=recvfrom (mysock,msg,sizeof(msg),0,&addr,&addr_len); (gdb) print mysock $1 = 7 (gdb) print msg $2 = '\000' <repeats 255 times> (gdb) next
最后一行输入next后就是运行recvfrom函数了,于是我打开终端运行client程序:
kl@kl-Latitude-D630:~/code/2$ ./udpc socket created. socket id: 3 romote ip: 127.0.0.1 remote port: 4567 hello Input message: hello
client程序运行顺利,输入"hello"成功,但是在server的调试终端始终没有显示,这和我直接运行server和client程序的结果是一样的,没有达到我调试的目的,现在一方面查阅书籍,一方面接受大家的建议,希望能把这个程序整好~~
我的server和client源代码在如下链接中(这是我提的问题,还在解决中,欢迎并感谢点拨一下~~)
http://www.oschina.net/question/437227_51491
继续学习中。。。。