linux udp socket编程,server client在本机中测试的原理?

发布于 2021-11-14 12:30:30 字数 2595 浏览 12 评论 18

我刚开始接触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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(18

爱的故事 2021-11-18 20:25:51

楼主很积极啊 好孩子  首先大陆的书有一个天大的误区 我敢说这里甚至你们老师都搞混淆了  套接字不是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也可以通信 很简单的 不明白你怎么会这么悲剧 

彼岸花ソ最美的依靠 2021-11-18 20:25:51

在下面@您好像没@到。。。

情栀口红 2021-11-18 20:25:50

bzero头文件是strings.h,不是string.h

南汐寒笙箫 2021-11-18 20:25:50

奥~^_^

尐偏执 2021-11-18 20:25:48

回复
没用你客户端程序测试

归属感 2021-11-18 20:25:48

回复
能收到client端发送的数据啦?

噩梦成真你也成魔 2021-11-18 20:25:35

回复
可以分别测试吗?我知道win下有小软件可以传输TCP和UDP 消息,您在linux下用的是什么? 我百度下一个试试~

奈何桥上唱咆哮 2021-11-18 20:25:30

回复
我刚从网上下了一个叫"sokit"的小软件,分别测试了一下server和client,结果server是好使的,client不好使。问题是出在client上,谢zino的点拨,缩小了范围,谢谢先~~

泛滥成性 2021-11-18 20:25:27

回复
我也才学网络编程,之前写过。修改你服务端程序,用我写的客户端测试的

清风夜微凉 2021-11-18 20:25:23

刚没看见是udp的

百思不得你姐 2021-11-18 20:24:43

我的调试过程在如下链接: http://my.oschina.net/socket/blog/55389 感觉不出有调试的效果阿?还需要怎么进行呢??

冷清清 2021-11-18 20:24:13

我又把程序的思路顺了一遍,运行结果如下:

先打开server:

kl@kl-Latitude-D630:~/code/2$ ./udps

socket created.

socket ID: 3

bind ok.

local port: 4567

月亮是我掰弯的 2021-11-18 20:22:55

在浏览器中输入127.0.0.1:(相应端口) ,服务器端还真可以得到内容,请参考HTTP协议

流心雨 2021-11-18 20:03:04

至于查错,socket的函数基本上返回小于0的值都表示出错,断点或者printf打印一下就知道哪里错了

柳若烟 2021-11-18 18:53:28

呼叫 @
中山野鬼

沦落红尘 2021-11-18 18:38:18

嗯~再追问一下: 1,在同一个主机下运行server和client的程序算不算是进程之间的通信(进程之间用进程号,这里用端口号是不是不算)? 2,那这个IP地址可以随意设置还是就必须是127.0.0.1? 非常谢谢~~

谁的新欢旧爱 2021-11-18 17:46:21

回复
进程间通信有很多方法,tcp/udp是非常经典的一种,如果用tcp/udp,那么只能用端口号而不是进程ID,本地进程间通信最好用127.0.0.1,因为127.0.0.1属于独立于物理网卡的虚拟设备,在网卡没有装的或者网络不通的情况下照样用

梦中楼上月下 2021-11-17 01:37:31

服务器端INADDR_ANY其实就是“0.0.0.0”,表示绑定所有地址(也就是任意地址),包括127.0.0.1,所以客户端连127.0.0.1是可以连上的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文