[关闭]
@expl0r3r 2018-06-26T13:09:15.000000Z 字数 2110 阅读 210

Client_UDP.c

ChatRoom


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<netinet/in.h>
  8. #include<arpa/inet.h>
  9. #include<unistd.h>
  10. #include<signal.h>
  11. #define N 128
  12. //message structrue
  13. typedef struct
  14. {
  15. char type;
  16. char name[32];
  17. char text[N];
  18. }MSG;
  19. //some variables and structures
  20. int socketfd;
  21. socklen_t addr_len;
  22. pid_t pid;
  23. MSG msg;
  24. struct sockaddr_in client_addr;
  25. //the initialize function,'argc' means the number of the arrays 'argv','argv[0]' means the path of this file
  26. //'argv[1]' and 'argv[2]' mean the two parameters you pass in,the first one is ip,the second one is port
  27. void init(int argc, char*argv[]){
  28. if(argc < 3){
  29. printf("uasge: %s ip port\n",argv[0]);
  30. exit(-1);
  31. }
  32. if((socketfd = socket(PF_INET,SOCK_DGRAM,0)) < 0){
  33. perror("socket failed");
  34. exit(-1);
  35. }
  36. printf("input name:\n");
  37. fgets(msg.name,64,stdin);
  38. msg.name[strlen(msg.name) - 1] = '\0';
  39. msg.type='L';
  40. memset(&client_addr,0,sizeof(client_addr));
  41. client_addr.sin_family = AF_INET;
  42. client_addr.sin_addr.s_addr = inet_addr(argv[1]);
  43. client_addr.sin_port = htons(atoi(argv[2]));
  44. addr_len = sizeof(client_addr);
  45. }
  46. //fork function runs once will return two result,the one is 0(means parent process),the other is the ip of the child process
  47. void start(){
  48. if(sendto(socketfd,&msg,sizeof(msg),0,(struct sockaddr*)&client_addr,addr_len) < 0){
  49. perror("sendto failed3");
  50. exit(-1);
  51. }
  52. if((pid = fork()) == -1 ){
  53. perror("fork failed");
  54. exit(-1);
  55. }
  56. if(pid == 0){
  57. while(1){
  58. fgets(msg.text,N,stdin);
  59. msg.text[strlen(msg.text) - 1] = '\0';
  60. if(strncmp(msg.text,"quit",4) == 0){
  61. msg.type = 'Q';
  62. if(sendto(socketfd,&msg,sizeof(msg),0,(struct sockaddr*)&client_addr,addr_len) < 0){
  63. perror("sendto failed2");
  64. exit(-1);
  65. }
  66. kill(getppid(),SIGKILL);
  67. break;
  68. }
  69. else{
  70. msg.type='B';
  71. if(sendto(socketfd,&msg,sizeof(msg),0,(struct sockaddr*)&client_addr,addr_len) < 0){
  72. perror("sendto failed1");
  73. exit(-1);
  74. }
  75. }
  76. }
  77. close(socketfd);
  78. }
  79. if(pid > 0){
  80. while(1){
  81. if(recvfrom(socketfd,&msg,sizeof(msg),0,(struct sockaddr*)&client_addr,&addr_len) < 0){
  82. perror("recvfrom failed");
  83. exit(-1);
  84. }
  85. switch(msg.type){
  86. case 'L':
  87. printf("%s login\n",msg.name);
  88. break;
  89. case 'B':
  90. printf("from %s > %s\n",msg.name,msg.text);
  91. break;
  92. case 'Q':
  93. printf("%s quit\n",msg.name);
  94. break;
  95. }
  96. }
  97. }
  98. }
  99. //main function
  100. int main(int argc,char *argv[]){
  101. init(argc,argv);
  102. start();
  103. return 0;
  104. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注