#include<stdio.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<errno.h>
#define PORT 8848
int main(void)
{
int sockfd, sendnum, recvnum;
int on = 1, sin_size =1;
char buf[100];
struct sockaddr_in serveraddr, clientaddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(serveraddr.sin_zero), 8);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
sendnum = sendto(sockfd, "hello client, welcome to server.\n", 25, 0, (struct sockaddr *)&clientaddr, sizeof(struct sockaddr));
if(sendnum == -1)
{
perror("sendto");
exit(1);
}
printf("send message to client ok\n");
recvnum = recvfrom(sockfd, buf, 100, 0, (struct sockaddr*)&clientaddr, &sin_size);
if(recvnum == -1)
{
perror("recvnum");
exit(1);
}
printf("receive %s from client\n", buf);
close(sockfd);
return 0;
}
上面的程序运行出错sendto: Address family not supported by protocol,
如果程序中把sendto函数去掉,只有recvfrom函数则不会出错,这是怎么回事?求高手指导
server.c
#include<stdio.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<errno.h>
#define PORT 8848
int main(void)
{
int sockfd, sendnum, recvnum;
int on = 1, sin_size =1;
char buf[100];
struct sockaddr_in serveraddr, clientaddr;
serveraddr.sin_family = AF_LOCAL;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(serveraddr.sin_zero), 8);
sockfd = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
/* sendnum = sendto(sockfd, "hello client, welcome to server.\n", 25, 0, (struct sockaddr *)&clientaddr, sizeof(struct sockaddr));
if(sendnum == -1)
{
perror("sendto");
exit(1);
}
printf("send message to client ok\n");
*/
recvnum = recvfrom(sockfd, buf, 100, 0, (struct sockaddr*)&clientaddr, &sin_size);
if(recvnum == -1)
{
perror("recvnum");
exit(1);
}
printf("receive %s\n", buf);
close(sockfd);
return 0;
}
client.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<errno.h>
#include<netdb.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define PORT 8848
int main(int argc, char **argv)
{
int sockfd, sendnum, recvnum, sin_size=1;
struct sockaddr_in serveraddr;
char rbuf[100];
struct hostent *hptr;
hptr = gethostbyname(argv[1]);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr = *((struct in_addr*)hptr->h_addr);
bzero(&(serveraddr.sin_zero), 8);
sendnum = sendto(sockfd, "hello server, i am your client\n", 50, 0, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));
if(sendnum == -1)
{
perror("sendto");
exit(1);
}
printf("send ok\n");
recvnum = recvfrom(sockfd, rbuf, 100, 0, (struct sockaddr*)&serveraddr, &sin_size);
close(sockfd);
return 0;
}
server.c中的注释部分取消注释后就出现如标题的错误,但是在client.c中可以运行啊,怎么回事?纠结中。。。求解答
首先说明一下什么是AF_INET:
AF 表示ADDRESS FAMILY 地址族,PF 表示PROTOCOL FAMILY 协议族。在windows操作系统中这两个宏定义是一样的,使用哪个都没有关系。而在Unix/Linux系统中,在不同的版本中这两者有微小差别。对于BSD,是AF,对于POSIX是PF UNIX系统支持AF_INET,AF_UNIX,AF_NS等,而DOS,Windows中仅支持AF_INET,它是网际网区域。在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.这几个参数有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.
部分文字有链接,希望这些链接对你有帮助。
多谢你的回答。不过我按照你说的修改后还是出现同样的错误。另外,sendto函数在client.c中可以正确运行不会出现上述错误,只是在server.c中出现这个错误