示例参考网上的一篇博客,
21天学通linux c的示例有些地方有错误
还有一些地方让人很迷糊
这个例子很好,敲一遍就都理解了
注释部分要详细的看看
//client端 #include <stdio.h> #include <stdlib.h> /* exit() 需要 */ #include <unistd.h> #include <strings.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #define PORT 4567 #define MAXDATASIZE 100 int main(int argc, const char *argv[]) { int fd; //socket产生的文件描述符
int numbytes; //接收recvfrom()获取的字节长度
char recvbuf[MAXDATASIZE]; char sendbuf[MAXDATASIZE]; struct hostent *he; //获取域名对应的ip struct sockaddr_in server,client; //本机连接示例:./udp_client.out 127.0.0.1
//就是gethostbyname()的参数是IP那也是可以的。 if (argc !=2) { printf("Usage: %s %s ",argv[0], "www.163.com"); exit(1); } //如果传入的是域名,通过域名解析出IP if ((he=gethostbyname(argv[1]))==NULL){ printf("gethostbyname() error "); exit(1); } //创建socket if ((fd=socket(AF_INET, SOCK_DGRAM, 0))==-1){ printf("socket() error "); exit(1); } //构建套接字:protocol + port + ip bzero(&server,sizeof(server)); //等同于memset server.sin_family = AF_INET; server.sin_port = htons(PORT); //转换端口为网络字符顺序 server.sin_addr = *((struct in_addr *)he->h_addr); //he->h_addr是IP地址,因为是字符串,所以是指针,所以用(struct in_addr *)转为in_addr结构体指针,然后用*在转为结构体
//上边如果要写IP地址的话,server.sin_addr.s_addr = inet_addr("127.0.0.1");
//开始写成了server.sin_addr.s_addr = htonl(inet_addr("127.0.0.1"))报错了,注意和server端的代码区别。
//inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。
//发送和接收消息,发送和接收的sockaddr都是server端的 socklen_t len; len=sizeof(struct sockaddr_in); while (1) { printf("input message:"); fgets(sendbuf,40,stdin); //得到stdin信息 //发送 sendto(fd,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&server,len); //接收,注意接收时sockaddr的长度是指针 if ((numbytes=recvfrom(fd,recvbuf,MAXDATASIZE,0,(struct sockaddr *)&server,&len)) == -1){ printf("recvfrom() error "); exit(1); } recvbuf[numbytes]='