歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux網絡 >> Linux網絡編程之套接字

Linux網絡編程之套接字

日期:2017/3/1 10:10:17   编辑:Linux網絡

套接字可以讓Linux在網絡上通信,用起來就像管道一樣,當然管道都是單向的,套接字既能寫也能收!

以下是多客戶服務器代碼:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <signal.h>
  7. #include <arpa/inet.h>
  8. #include <string.h>
  9. #define PORT 6000
  10. #define SIZE 256
  11. static void handler()//回收子進程函數
  12. {
  13. wait(NULL);
  14. }
  15. int main(int argc, char **argv)
  16. {
  17. int server_socketfd;
  18. int client_socketfd;
  19. int ret;
  20. pid_t pid;
  21. size_t address_len;
  22. struct sockaddr_in server_address;
  23. struct sockaddr_in client_address;
  24. server_socketfd = socket(AF_INET, SOCK_STREAM,0);//創建一個套接字
  25. memset(&server_address,0,sizeof(struct sockaddr_in));
  26. server_address.sin_family = AF_INET;//協議族設置為ARPA因特網協議
  27. server_address.sin_port = htons(PORT);//端口號設為PORT(6000)
  28. server_address.sin_addr.s_addr = htonl(INADDR_ANY);//允許任何客戶端可以連接
  29. address_len = sizeof(struct sockaddr_in);
  30. ret = bind(server_socketfd, (struct sockaddr*)&server_address, address_len);//將創建的套接字和address中的地址綁定在一起
  31. if( ret == -1 )
  32. {
  33. printf("bind failed!\n");
  34. exit(0);
  35. }
  36. ret = listen(server_socketfd, 5);//創建一個監聽5個請求的隊列,也就是說這個服務器允許5個人同時登入
  37. if ( ret == -1 )
  38. {
  39. printf("listen failed!\n");
  40. exit(0);
  41. }
  42. while (1)
  43. {
  44. client_socketfd = accept(server_socketfd, (struct sockaddr*)&client_address, &address_len);//客戶連接服務器時建立客戶套接字
  45. signal(SIGCHLD,handler);//為了避免子進程結束時造成僵屍進程,需要對結束子進程作處理,handler函數負責回收子進程
  46. pid = fork();
  47. if (pid == 0)//為客戶分配的子進程
  48. {
  49. char buffer[256];
  50. int nread;
  51. nread = read(client_socketfd,buffer,sizeof(buffer));
  52. printf("%s",buffer);
  53. }
  54. else if (pid > 0)//父進程把分配的客戶套接字關閉,用來供給下個客戶
  55. {
  56. close(client_socketfd);//關閉客戶套接字
  57. }
  58. else
  59. {
  60. printf("fork faild!\n");
  61. exit(0);
  62. }
  63. }
  64. return 0;
  65. }

客戶端代碼:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <string.h>
  9. #define SIZE 256
  10. #define PORT 6000
  11. int main()
  12. {
  13. int socketfd;
  14. int ret;
  15. char buffer[SIZE];
  16. struct sockaddr_in address;
  17. socketfd = socket(AF_INET, SOCK_STREAM, 0);//創建一個套接字
  18. address.sin_family = AF_INET;//設置為因特網協議
  19. address.sin_port = htons(PORT);//設置端口號
  20. inet_pton(AF_INET, "127.0.0.1", &address.sin_addr.s_addr);//設置ip地址
  21. ret = connect(socketfd, (struct sockaddr*) &address, sizeof(address));//連接服務器
  22. if (ret == -1)
  23. {
  24. printf("can't connect!\n");
  25. exit(0);
  26. }
  27. printf("send:");
  28. fgets(buffer,sizeof(buffer),stdin);
  29. write(socketfd,buffer,sizeof(buffer));//把數據傳給服務器
  30. close(socketfd);//關閉套接字
  31. return 0;
  32. }
Copyright © Linux教程網 All Rights Reserved