设为首页 加入收藏

TOP

18.3.9 套接字通信
2013-10-12 06:54:18 来源: 作者: 【 】 浏览:92
Tags:18.3.9 套接字 通信

18.3.9  套接字通信

本节将设计两个例子演示套接字通信的过程,其中一个为服务器程序,另一个为客户程序。

1.服务器程序

服务器程序的代码如下:

  1. #include <sys/types.h> 
  2. #include <sys/socket.h>                        
    // 包含套接字函数库  
  3. #include <stdio.h> 
  4. #include <netinet/in.h>                        
    // 包含AF_INET相关结构  
  5. #include <arpa/inet.h>                          
    // 包含AF_INET相关操作的函数  
  6. #include <unistd.h> 
  7. int main()  
  8. {  
  9.    int server_sockfd, client_sockfd;    // 用于保
    存服务器和客户套接字标识符  
  10.    int server_len, client_len;          // 用于
    保存服务器和客户消息长度  
  11.    struct sockaddr_in server_address;   // 定义服务器套接字地址  
  12.    struct sockaddr_in client_address;   // 定义客户套接字地址  
  13.    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    // 定义套接字类型  
  14.    server_address.sin_family = AF_INET; // 定义套接字地址中的域  
  15.    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");  
  16.                                         // 定义套接字地址  
  17.    server_address.sin_port = 9734;      // 定义套接字端口  
  18.    server_len = sizeof(server_address);  
  19.    bind(server_sockfd, (struct sockaddr *) &server_
    address, server_len);    // 定义套接字名字  
  20.    listen(server_sockfd, 5);            // 创建套接字队列  
  21.    while (1) {  
  22.       char ch;  
  23.       printf("服务器等待消息\n");  
  24.       client_len = sizeof(client_address);  
  25.       client_sockfd = accept(server_sockfd,         // 接收连接  
  26.             (struct sockaddr *) &client_address,  
  27.             (socklen_t *__restrict) &client_len);  
  28.       read(client_sockfd, &ch, 1);                  // 读取客户消息  
  29.       ch++;  
  30.       write(client_sockfd, &ch, 1);                 // 向客户传送消息  
  31.       close(client_sockfd);                         // 关闭连接  
  32.    }  

该程序监听本地的9734端口,程序运行后等待客户通过该端口连接,从客户传送的消息里读取一个字符,然后对该字符进行加1操作后,再传送给客户,并关闭该连接。

2.客户程序

客户程序的源代码如下:

  1. #include <sys/types.h> 
  2. #include <sys/socket.h>                     // 包含套接字函数库  
  3. #include <stdio.h> 
  4. #include <netinet/in.h>                     // 包含
    AF_INET相关结构  
  5. #include <arpa/inet.h>                      // 包含
    AF_INET相关操作的函数  
  6. #include <unistd.h> 
  7. int main() {  
  8.    int sockfd;                              // 用于
    保存客户套接字标识符  
  9.    int len;                                 // 用于
    保存客户消息长度  
  10.    struct sockaddr_in address;              // 定义
    客户套接字地址  
  11.    int result;  
  12.    char ch = 'A';                           // 定义
    要传送的消息  
  13.    sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义
    套接字类型  
  14.    address.sin_family = AF_INET;            // 定义
    套接字地址中的域  
  15.    address.sin_addr.s_addr = inet_addr("127.0.0.1");  
    // 定义套接字地址  
  16.    address.sin_port = 9734;                        
    // 定义套接字端口  
  17.    len = sizeof(address);  
  18.    result = connect(sockfd, (struct sockaddr *) 
    &address, len);   
  19.                                               
    // 请求连接  
  20.    if (result == -1) {  
  21.       perror("连接失败");  
  22.       return 1;  
  23.    }  
  24.    write(sockfd, &ch, 1);                       
    // 向服务器传送消息  
  25.    read(sockfd, &ch, 1);                        
    // 从服务器接收消息  
  26.    printf("来自服务器的消息是%c\n", ch);  
  27.    close(sockfd);                            
    // 关闭连接  
  28.    return 0;  

客户端程序向本地的9734端口请求连接,如果连接成功即发送一个字符A作为消息。然后从服务器传送的消息中读取一个字符,并将该字符输出,退出程序。

将这两个程序分别编译,然后打开两个终端,第一个终端运行服务器程序,这时会出现提示符"服务器等待消息"。第二个终端运行客户程序,客户程序会将字符A作为消息传送给服务器程序,然后服务器程序对该字符进行加1处理,传送回客户程序。客户程序的输出是"来自服务器的消息是B"。这样两个程序就完成了连接和通信。结束客户端程序可使用组合键Ctrl + C。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇18.1 计算机网络组成 下一篇18.3.3 套接字地址

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: