linux C 套接字编程 有个地方不懂 求指教

时间:2023-02-08 18:27:29
代码所做的事:在客户端定义一个字符'A',在服务器端将其加1,然后在客户端输出。代码没有错误。
客户端代码:


1 #include <sys/types.h>
  2 #include <sys/socket.h>
  3 #include <stdio.h>
  4 #include <sys/un.h>
  5 #include <unistd.h>
  6 #include <stdlib.h>
  7 
  8 int main()
  9 {
 10     int sockfd;
 11     int len;
 12     struct sockaddr_un address;
 13     int result;
 14     char ch = 'A';
 15 
 16     sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
 17     address.sun_family = AF_UNIX;
 18     strcpy(address.sun_path, "server_socket");
 19     len = sizeof(address);
 20 
 21     result = connect(sockfd, (struct sockaddr *)&address, len);
 22     if (result == -1)
 23     {
 24         perror("oops:client1");
 25         exit(1);
 26     }
 27     write(sockfd, &ch, 1);                                                                                                                          
 28     printf("char from server = %c\n", ch);
 29     read(sockfd, &ch, 1);
 30     printf("char from server = %c\n", ch);

 31     close(sockfd);
 32     exit(0);
 33     
 34 }   
~        



服务器端代码:

  1 #include <sys/types.h>                                                                                                                              
  2 #include <sys/socket.h>
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <sys/un.h>
  6 #include <unistd.h>
  7 
  8 int main()
  9 {
 10     int server_sockfd, client_sockfd;
 11     int server_len, client_len;
 12     struct sockaddr_un server_address;
 13     struct sockaddr_un client_address;
 14 
 15     unlink("server_socket");
 16     server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
 17 
 18     server_address.sun_family = AF_UNIX;
 19     strcpy(server_address.sun_path, "server_socket");
 20     server_len = sizeof(server_address);
 21     bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
 22 
 23     listen(server_sockfd, 5);
 24     while(1)
 25     {
 26         char c;
 27         printf("sever waiting\n");
 28 
 29         client_len = sizeof(client_address);
 30         client_sockfd= accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
 31 
 32         read(client_sockfd, &c, 1);
 33         c++;
 34         sleep(10);
 35         write(client_sockfd, &c, 1);
 36         close(client_sockfd);
 37         printf("I am server, I have execed!\n");
 38     }
 39 }




我的不懂的地方:在客户端的代码中,write函数下句输出的是‘A’, read函数下句输出的是‘B’, 这意味着,在客户端执行完write函数后暂停,直到执行完服务器端中的处理字符的这部分代码后再执行客户端的read函数及其后面的代码。我这样理解对吗,无论对否,该怎么解释这个现象呢?谢谢各位大神了!



3 个解决方案

#1


read默认是阻塞的,直到socket中有数据时才返回
所以感觉它是暂停的

#2


客户端定义的socket是阻塞的,所以read函数调用会阻塞直到有数据进来,很快就返回,说明服务器返回'b'很快

#3


因为 你的sock_fd 是阻塞的,只有收到数据,否则就一直阻塞在read。你可以看一下unix 高编里的  select() 函数,可以设置非阻塞的。

#1


read默认是阻塞的,直到socket中有数据时才返回
所以感觉它是暂停的

#2


客户端定义的socket是阻塞的,所以read函数调用会阻塞直到有数据进来,很快就返回,说明服务器返回'b'很快

#3


因为 你的sock_fd 是阻塞的,只有收到数据,否则就一直阻塞在read。你可以看一下unix 高编里的  select() 函数,可以设置非阻塞的。