一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的
各位看官们,大家好,上1回中我们说的是基于AF_INET域的流套接字通讯的例子,这1回我们说的例子是:基于AF_INET域的数据报套接字通讯 。闲话休提,言归正转。让我们1起talk C栗子吧! 看官们,我们在上1回中1起制作了我们的第3道佳肴是:基于AF_INET域的流套接字通讯。今天,我将和大家1起制作第4道佳肴:基于AF_INET域的数据报套接字通讯。
看官们,以上的内容,我们在前面章回中都详细介绍过,如果大家忘记的话,可以参考前面的内容,重点是第1百4108回的内容,由于这是我们的菜谱。在食材中最麻烦是套接字地址信息,大家可以参考1百5105回中的例子。多说无益,我们通过具体的代码来演示 。 服务器真个通讯进程及其代码//1.设置服务器端套接字的属性:域,类型和协议;
char * host = "localhost"; //using localhost IP address:127.0.0.1
char * server = "1080"; //using port 1080,it must be more then 1024
struct addrinfo hints;
struct addrinfo *result;
struct sockaddr_in client_address;
memset(&hints,0,sizeof(struct addrinfo));
result = NULL;
hints.ai_flags = AI_NUMERICSERV;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
//get address info,it has all attribute of socket
res = getaddrinfo(host,server,&hints,&result);
//2. 创建服务器端套接字
server_fd = socket(result->ai_family,result->ai_socktype,result->ai_protocol);
//3.把服务器真个套接字和服务器的地址绑定在1起
res = bind(server_fd,result->ai_addr,result->ai_addrlen);
//4.通过套接字读取数据,这里使用的是recvfrom函数;
addr_len = 0;
res = recvfrom(server_fd,buf,BUF_SIZE,(struct sockaddr *)&client_address,&addr_len);
printf("[server] receiving data (%s) from client by socketn",buf);
//5.释放套接字地址信息。这里没有释放套接字,由于在客户端已释放并且关闭通讯
if(result->ai_next)
freeaddrinfo(result); 客户真个通讯进程及其代码//1.设置客户端套接字的属性:域,类型和协议;
char * host = "localhost"; //using localhost IP address:127.0.0.1
char * server = "1080"; //using port 1080,it must be more then 1024
struct addrinfo hints;
struct addrinfo *result;
memset(&hints,&result);
//2.创建客户端套接字;
client_fd = socket(result->ai_family,result->ai_protocol);
//3.通过套接字发送数据,这里我们使用的是sendto函数;
printf("[client] sending data (%s )to server by socket n",buf);
res = sendto(client_fd,sizeof(buf),result->ai_addrlen);
//4.释放套接字,断开客户端与服务器真个通讯;
if(result->ai_next)
freeaddrinfo(result);
res = close(client_fd); 看官们,以上是核心代码,完全的代码放到了我的资源中,大家可以点击这里下载使用。 关于上面的代码,我做1点扼要的说明。我们首先获得套接字地址的信息,然后才创建套接字。这和前1回的步骤相同,基中人缘由也相同,所以就不作详细介绍了。在这里,我们使用了getaddrinfo函数的结果,这类方法可以提高代码的移植性。这类方法,也使用在了bind函数和sendto函数中。代码中其它的内容和前1章回中的内容10分类似,所以就不作详细介绍了。 我们需要把服务器真个代码和客户真个代码分别进行编译,并且编译成不同的可以履行文件: $ gcc Ex093_InetDgramSocketClient.c -o client //编译客户端
$ gcc Ex093_InetDgramSocketServer.c -o server //编译服务器端 看官们,美味佳肴做好了,我们1起来品味下,品味方法就是运行程序,下面是程序的运行结果,请大家参考: $ ./server & //在后面运行服务器
[1] 5689
$ ./client //运行客户端
please input less then 8 chars for using.
dgram
[client] sending data (dgram )to server by socket
[server] receiving data (dgram) from client by socket
[1]+ Done ./server //服务器运行结束 看官们,从上面的运行结果中可以看到,客户端通过套接字发送数据给服务器,而服务器通过套接字接收客户端发来的数据,这样客户端和服务器端可以通过套接字进行通讯。另外,我们进行了1次通讯,通讯的次数可以自己控制,乃至写成无穷次也是可以的。每次通讯可以看做是1个完全的通讯进程,我们在通讯进程中发送的数据是字符串”dgram”,大家也能够发送其它的字符串。 各位看官,关于基于AF_INET域的数据报套接字通讯的例子我们就说到这里。欲知后面还有甚么例子,且听下回分解 。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |