当前位置: 技术问答>linux和unix
请教:一个linux下socket编程的问题!
来源: 互联网 发布时间:2015-12-09
本文导语: 写了一段程序,想实现以下功能:客户端向服务器发送数据,服务器收到数据后打印出客户端的IP地址和发送数据的端口号,并且发送一个回复信息到这个IP和端口号。服务器的ip是211.84.93.111。用5060端口接收数据(客...
写了一段程序,想实现以下功能:客户端向服务器发送数据,服务器收到数据后打印出客户端的IP地址和发送数据的端口号,并且发送一个回复信息到这个IP和端口号。服务器的ip是211.84.93.111。用5060端口接收数据(客户端和服务器运行于同一台机器上)。
但是运行的时候出现了下面的问题:
1 先运行server程序,再运行client程序。第一次运行client时server给出的ip和端口号总是不正确,并不是实际client的ip地址端口号,客户端也接收不到回复信息。这是什么原因呢?
2 能不能给客户端指定一个端口号来发送数据呢,而不是让系统随机指定?
请各位高手指教,谢谢了!
server.c
#include
#include
int main()
{
int sock,i;
struct sockaddr_in address,addr;
char *ip;
int port;
char buff[500];
sock=socket(AF_INET,SOCK_DGRAM,0);
addr.sin_family=PF_INET;
address.sin_family=PF_INET;
address.sin_port=htons(5060);
address.sin_addr.s_addr=inet_addr("211.84.93.111");
bind(sock,(struct sockaddr *)&address,sizeof(address));
while(1)
{
recvfrom(sock,buff,500,0,(struct sockaddr *)&addr,&i);
ip=(char *)inet_ntoa(addr.sin_addr);
port=addr.sin_port;
printf("ip is%s nport is:%dn",ip,port);
strcpy(buff,"reply from server");
sendto(sock,buff,500,0,(struct sockaddr *)&addr,sizeof(addr));
sleep(1);
}
puts("over!");
}
client.c
#include
int main()
{
int sock,i;
struct sockaddr_in address,addr;
char buff[500];
sock=socket(AF_INET,SOCK_DGRAM,0);
address.sin_family=PF_INET; //address用来记录源地址
address.sin_port=0;
address.sin_addr.s_addr=0;
addr.sin_family=PF_INET; //addr用来记录目标地址
addr.sin_port=htons(5060);
addr.sin_addr.s_addr=inet_addr("211.84.93.111");
strcpy(buff,"clinet message");
sendto(sock,buff,500,0,(struct sockaddr *)&addr,sizeof(addr));
recvfrom(sock,buff,500,0,(struct sockaddr *)&address,&i);
printf("buff is: %sn",buff);
}
但是运行的时候出现了下面的问题:
1 先运行server程序,再运行client程序。第一次运行client时server给出的ip和端口号总是不正确,并不是实际client的ip地址端口号,客户端也接收不到回复信息。这是什么原因呢?
2 能不能给客户端指定一个端口号来发送数据呢,而不是让系统随机指定?
请各位高手指教,谢谢了!
server.c
#include
#include
int main()
{
int sock,i;
struct sockaddr_in address,addr;
char *ip;
int port;
char buff[500];
sock=socket(AF_INET,SOCK_DGRAM,0);
addr.sin_family=PF_INET;
address.sin_family=PF_INET;
address.sin_port=htons(5060);
address.sin_addr.s_addr=inet_addr("211.84.93.111");
bind(sock,(struct sockaddr *)&address,sizeof(address));
while(1)
{
recvfrom(sock,buff,500,0,(struct sockaddr *)&addr,&i);
ip=(char *)inet_ntoa(addr.sin_addr);
port=addr.sin_port;
printf("ip is%s nport is:%dn",ip,port);
strcpy(buff,"reply from server");
sendto(sock,buff,500,0,(struct sockaddr *)&addr,sizeof(addr));
sleep(1);
}
puts("over!");
}
client.c
#include
int main()
{
int sock,i;
struct sockaddr_in address,addr;
char buff[500];
sock=socket(AF_INET,SOCK_DGRAM,0);
address.sin_family=PF_INET; //address用来记录源地址
address.sin_port=0;
address.sin_addr.s_addr=0;
addr.sin_family=PF_INET; //addr用来记录目标地址
addr.sin_port=htons(5060);
addr.sin_addr.s_addr=inet_addr("211.84.93.111");
strcpy(buff,"clinet message");
sendto(sock,buff,500,0,(struct sockaddr *)&addr,sizeof(addr));
recvfrom(sock,buff,500,0,(struct sockaddr *)&address,&i);
printf("buff is: %sn",buff);
}
|
MARK
|
address.sin_family=PF_INET; //address用来记录源地址
address.sin_port=0;
address.sin_addr.s_addr=0;
addr.sin_family=PF_INET; //addr用来记录目标地址
addr.sin_port=htons(5060);
addr.sin_addr.s_addr=inet_addr("211.84.93.111");
==================
搞不懂你为什么既记录源地址,又记录目标地址?
其实这里sendto 和recvfrom 只需要 addr 即可。
address.sin_port=0;
address.sin_addr.s_addr=0;
addr.sin_family=PF_INET; //addr用来记录目标地址
addr.sin_port=htons(5060);
addr.sin_addr.s_addr=inet_addr("211.84.93.111");
==================
搞不懂你为什么既记录源地址,又记录目标地址?
其实这里sendto 和recvfrom 只需要 addr 即可。
|
看看UNIX网络编程 吧,里面有这个例子的.