linux udp socket编程,server client在本机中测试的原理?
我刚开始接触linux下的socket编程,边抄边理解udp socket编程,我的疑问是server不指定IP地址,client的目标IP地址是127.0.0.1,这样就可以通信吗?在同一主机下是不是不能测试?如果server默认绑定本机的IP 地址,那么开启server后,在浏览器中输入127.0.0.1:(相应端口) 也可以得到数据?我的程序如下,没有跑起来,其实我觉得我不会测试,不知道本质所以会有细节漏掉。(使用的系统是ubuntu 11.10 ,编译器GCC ,分别在同一主机下的两个终端中运行生成的.out文件。)提前感谢大家的回答,不管多少,您的回答让一个初学者非常暖心~~
服务器程序
#include<stdio.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #define lport 4567 int main() { int mysock,len; struct sockaddr_in addr; int i=0; char msg[256]; int addr_len; if((mysock=socket(AF_INET,SOCK_DGRAM,0))<0) { perror("error"); exit(1); } else { printf("socket created.n"); printf("socket ID: %dn",mysock); } addr_len=sizeof(struct sockaddr_in); bzero(&addr,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(lport); addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(mysock,&addr,sizeof(addr))<0) { perror("connect"); exit(1); } else { printf("bind ok.n"); printf("local port: %dn",lport); } while(1) { bzero(msg,sizeof(msg)); len=recvfrom (mysock,msg,sizeof(msg),0,&addr,&addr_len); printf("%d: ",i); i++; printf("message form: %sn",inet_ntoa(addr.sin_addr)); printf("message: %snn",msg); sendto(mysock,msg,len,0,&addr,addr_len); } return 0; }客户机程序:
#include<stdio.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<sys/types.h> #include<sys/socket.h> #define rport 4567 #define rip "127.0.0.1" int main() { int s,len; struct sockaddr_in addr; int addr_len; char msg[256]; int i=0; if((s=socket(AF_INET,SOCK_DGRAM,0))<0) { perror("error"); exit(1); } else { printf("socket created.n"); printf("socket id: %dn",s); printf("romote ip: %sn",rip); printf("remote port: %dn",rport); } len=sizeof(struct sockaddr_in); bzero(&addr,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(rport); addr.sin_addr.s_addr=inet_addr(rip); while(1) { bzero(msg,sizeof(msg)); len=read(STDIN_FILENO,msg,sizeof(msg)); sendto(s,msg,len,0,&addr,addr_len); printf("nInput message: %sn",msg); len=recvfrom(s,msg,sizeof(msg),0,&addr,&addr_len); printf("%d :",i); i++; printf("received message: %s n",msg); } return 0; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
楼主很积极啊 好孩子 首先大陆的书有一个天大的误区 我敢说这里甚至你们老师都搞混淆了 套接字不是TCPIP作者首创 而是加州大学伯克利首创 第一个版本并不支持TCPIP 只支持本地或网络映射文件 也就是说 Unix原始套接字其实 是通过 "用文件管道" 的方式(/temp/~) 定义了最初的套接字 那个版本的实现里 只要能够通过一个临时文件建立管道PIPE 就可以进行通信 甚至不需要端口和mac
至于后来TCPIP时代的"套接字"的含义已经完全变了 简单说 底层交给协议去实现 抓包解包三不管 端口对端口 防火强也是三不管 只看端口 UDP TCP也好都是IP协议的具体实现 这个你可以合二为一看 记住 端口 ip4地址 一个run_4_ever()的循环监听+协议实现 就是一个简单的服务器 你甚至可以在win下用telnet访问http服务器 OSchina上多的是这类Java写的demo服务器 跟语言无关 运行即可访问
至于你说的调试 我写一个http 的python 和 c通信 客户端没写 就用的telnet 虚拟机开的nat 几分钟就好了 后来写java也可以通信 很简单的 不明白你怎么会这么悲剧
在下面@您好像没@到。。。
bzero头文件是strings.h,不是string.h
奥~^_^
回复
没用你客户端程序测试
回复
能收到client端发送的数据啦?
回复
可以分别测试吗?我知道win下有小软件可以传输TCP和UDP 消息,您在linux下用的是什么? 我百度下一个试试~
回复
我刚从网上下了一个叫"sokit"的小软件,分别测试了一下server和client,结果server是好使的,client不好使。问题是出在client上,谢zino的点拨,缩小了范围,谢谢先~~
回复
我也才学网络编程,之前写过。修改你服务端程序,用我写的客户端测试的
刚没看见是udp的
我的调试过程在如下链接: http://my.oschina.net/socket/blog/55389 感觉不出有调试的效果阿?还需要怎么进行呢??
我又把程序的思路顺了一遍,运行结果如下:
先打开server:
kl@kl-Latitude-D630:~/code/2$ ./udps
socket created.
socket ID: 3
bind ok.
local port: 4567
在浏览器中输入127.0.0.1:(相应端口) ,服务器端还真可以得到内容,请参考HTTP协议
至于查错,socket的函数基本上返回小于0的值都表示出错,断点或者printf打印一下就知道哪里错了
呼叫 @
中山野鬼
嗯~再追问一下: 1,在同一个主机下运行server和client的程序算不算是进程之间的通信(进程之间用进程号,这里用端口号是不是不算)? 2,那这个IP地址可以随意设置还是就必须是127.0.0.1? 非常谢谢~~
回复
进程间通信有很多方法,tcp/udp是非常经典的一种,如果用tcp/udp,那么只能用端口号而不是进程ID,本地进程间通信最好用127.0.0.1,因为127.0.0.1属于独立于物理网卡的虚拟设备,在网卡没有装的或者网络不通的情况下照样用
服务器端
INADDR_ANY其实就是“0.0.0.0”,表示绑定所有地址(也就是任意地址),包括127.0.0.1,所以客户端连
127.0.0.1是可以连上的。