UDP 聊天室 .

来源:互联网 发布:西安交大网络导航 编辑:程序博客网 时间:2024/05/20 21:19
学过Socket编程,连个UDP聊天室也没写过实在是说不过去了。写个简单的聊天室。客户端通过向服务器发送数据进行对话。所有信息在服务端显示。

   运行效果:

 

   服务端:

[plain] view plaincopyprint?
  1. [fsy@localhost my_socket]$ ./udps  
  2. create socket.  
  3. bind address to socket.  
  4. fsy said: i'm coming~  
  5.   
  6. saosao123 said: leave me alone  
  7.   
  8. fsy said: come baby  
  9.   
  10. saosao123 said: who r u ?  
  11.   
  12. fsy said: just guess~  
  13.   
  14. Teacher said: shut up u guys  
[fsy@localhost my_socket]$ ./udpscreate socket.bind address to socket.fsy said: i'm coming~saosao123 said: leave me alonefsy said: come babysaosao123 said: who r u ?fsy said: just guess~Teacher said: shut up u guys

 

客户端:

[plain] view plaincopyprint?
  1. [fsy@localhost my_socket]$ ./udpc 192.168.189.13 saosao123  
  2. create socket.  
  3. Welcome Mr. saosao123!  
  4. leave me alone  
  5. who r u ?  
[fsy@localhost my_socket]$ ./udpc 192.168.189.13 saosao123create socket.Welcome Mr. saosao123!leave me alonewho r u ?

 


服务端程序:

 

[cpp] view plaincopyprint?
  1. include <stdio.h>  
  2. #include <string.h>   
  3. #include <sys/types.h>   
  4. #include <netinet/in.h>   
  5. #include <sys/socket.h>   
  6. #include <errno.h>   
  7. #include <stdlib.h>   
  8. #include <arpa/inet.h>   
  9.   
  10. int main(int argc, char **argv){  
  11.     struct sockaddr_in s_addr,c_addr;  
  12.     int sock;  
  13.     socklen_t addr_len;  
  14.     int len;  
  15.     char buff[128];  
  16.   
  17.     if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {  
  18.         perror("socket");  
  19.         exit(errno);  
  20.     } else  
  21.         printf("create socket.\n\r");  
  22.   
  23.     memset(&s_addr, 0, sizeof(struct sockaddr_in));  
  24.   
  25.     s_addr.sin_family = AF_INET;  
  26.     s_addr.sin_port = htons(7838);  
  27.     s_addr.sin_addr.s_addr = INADDR_ANY;  
  28.   
  29.     if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) {  
  30.         perror("bind");  
  31.         exit(errno);  
  32.     } else  
  33.         printf("bind address to socket.\n\r");  
  34.   
  35.     addr_len = sizeof(c_addr);  
  36.     while (1) {  
  37.         len = recvfrom(sock, buff, sizeof(buff) - 1, 0, (struct sockaddr *) &c_addr, &addr_len);  
  38.         if (len < 0) {  
  39.             perror("recvfrom");  
  40.             exit(errno);  
  41.         }  
  42.         buff[len] = '\0';  
  43.         printf("%s\n", buff);  
  44.     }  
  45.     return 0;  
  46. }  
include <stdio.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <errno.h>#include <stdlib.h>#include <arpa/inet.h>int main(int argc, char **argv){    struct sockaddr_in s_addr,c_addr;    int sock;    socklen_t addr_len;    int len;    char buff[128];    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {        perror("socket");        exit(errno);    } else        printf("create socket.\n\r");    memset(&s_addr, 0, sizeof(struct sockaddr_in));    s_addr.sin_family = AF_INET;    s_addr.sin_port = htons(7838);    s_addr.sin_addr.s_addr = INADDR_ANY;    if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) {        perror("bind");        exit(errno);    } else        printf("bind address to socket.\n\r");    addr_len = sizeof(c_addr);    while (1) {        len = recvfrom(sock, buff, sizeof(buff) - 1, 0, (struct sockaddr *) &c_addr, &addr_len);        if (len < 0) {            perror("recvfrom");            exit(errno);        }        buff[len] = '\0';        printf("%s\n", buff);    }    return 0;}


 

客户端程序:

 

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <string.h>   
  3. #include <sys/types.h>   
  4. #include <netinet/in.h>   
  5. #include <sys/socket.h>   
  6. #include <errno.h>   
  7. #include <stdlib.h>   
  8. #include <arpa/inet.h>   
  9.   
  10. int main(int argc, char **argv){  
  11.     struct sockaddr_in s_addr;  
  12.     int sock;  
  13.     int addr_len;  
  14.     int len;  
  15.     char buff[128];  
  16.     char message[128];  
  17.   
  18.     if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {  
  19.         perror("socket");  
  20.         exit(errno);  
  21.     } else  
  22.         printf("create socket.\n\r");  
  23.   
  24.     s_addr.sin_family = AF_INET;  
  25.     s_addr.sin_port = htons(7838);  
  26.     if (argc==3){  
  27.         s_addr.sin_addr.s_addr = inet_addr(argv[1]);  
  28.     }  
  29.     else {  
  30.         printf("Usage: %s <server ip> <UserName>!\n");  
  31.         exit(0);  
  32.     }  
  33.     printf("Welcome Mr. %s!\n",argv[2]);  
  34.     while(1){  
  35.         memset(buff,0,sizeof(buff));  
  36.         memset(message,0,sizeof(message));  
  37.         //这里为了连接字符串又弄了一个buff,应该有更好的办法,望路过的高手赐教  
  38.         strcpy(buff,argv[2]);  
  39.         strcat(buff," said: ");  
  40.         fgets(message,128,stdin);  
  41.         strcat(buff,message);  
  42.         addr_len = sizeof(s_addr);  
  43.         len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len);  
  44.         if (len < 0) {  
  45.             printf("\n\rsend error.\n\r");  
  46.             return 1;  
  47.         }  
  48.     }  
  49.     return 0;  
  50. }  
#include <stdio.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <errno.h>#include <stdlib.h>#include <arpa/inet.h>int main(int argc, char **argv){    struct sockaddr_in s_addr;    int sock;    int addr_len;    int len;    char buff[128];    char message[128];    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {        perror("socket");        exit(errno);    } else        printf("create socket.\n\r");    s_addr.sin_family = AF_INET;    s_addr.sin_port = htons(7838);    if (argc==3){        s_addr.sin_addr.s_addr = inet_addr(argv[1]);    }    else {        printf("Usage: %s <server ip> <UserName>!\n");        exit(0);    }    printf("Welcome Mr. %s!\n",argv[2]);    while(1){        memset(buff,0,sizeof(buff));        memset(message,0,sizeof(message));        //这里为了连接字符串又弄了一个buff,应该有更好的办法,望路过的高手赐教        strcpy(buff,argv[2]);        strcat(buff," said: ");        fgets(message,128,stdin);        strcat(buff,message);        addr_len = sizeof(s_addr);        len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len);        if (len < 0) {            printf("\n\rsend error.\n\r");            return 1;        }    }    return 0;}


 

 本篇博客出自  阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/6924011

原创粉丝点击