Linux下多人聊天空间代码(共7页).doc
精选优质文档-倾情为你奉上 Linux下多人聊天空间代码在相同目录下新建文件wwb.h、wwb.c、room.c,把下面相应的代码拷进这两个文件里;再建一个recv.txt,该文件用于保存和显示聊天记录。在Linux中,使用下面命令编译:gcc -o room room.c wwb.c 使用命令运行:./room 使用命令查看聊天记录:tail -f recv.txt/wwb.h头文件 int WriteLog(const char *format, .); /写日志文件char* GetSysTime(char* time); /得到系统时间/wwb.c 代码#include <time.h>#include <unistd.h>#include <stdio.h>#include <sys/mman.h>#include <fcntl.h>#include <string.h>#include <stdlib.h>#include <stdarg.h>int WriteLog(const char *format, .) FILE *fp; fp=fopen("recv.txt", "a+"); if(fp=NULL) return -1; va_list arg_ptr; va_start(arg_ptr, format); vfprintf(fp, format, arg_ptr); va_end(arg_ptr); fclose(fp); return 0;char* GetSysTime(char *out) time_t timep; struct tm *p; time(&timep); p=localtime(&timep); int year=(1900+p->tm_year); int month=(1+p->tm_mon); int day=p->tm_mday; int hour=p->tm_hour; int minute=p->tm_min; int second=p->tm_sec; sprintf(out,"%d-",year); if(month<10) sprintf(out+5,"0%d-",month); else sprintf(out+5,"%d-",month); if(day<10) sprintf(out+8,"0%d ",day); else sprintf(out+8,"%d ",day); if(hour<10) sprintf(out+11,"0%d:",hour); else sprintf(out+11,"%d:",hour); if(minute<10) sprintf(out+14,"0%d:",minute); else sprintf(out+14,"%d:",minute); if(second<10) sprintf(out+17,"0%d",second); else sprintf(out+17,"%d",second); return out;/*int main() char time50; int i=10; char *s="hello" WriteLog("%s,%d,%sn", GetSysTime(time),i,s);*/room.c 主程序代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include "wwb.h"#define BUFSIZE 255int main(int argc, char *argv) if (argc !=2) printf("Parameter(s): <username>n"); exit(1); char *username=argv1; /* char username16=0; do printf("请输入你的用户名:"); fgets(username,16,stdin); while(!(strcmp(username,"n");*/ in_port_t servPort = 5000; char *bcIP = "192.168.12.255" in_port_t bcPort = 5000; pid_t pid; pid = fork(); if(pid > 0) /Parent Process int sock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock1 < 0) printf("socket() failedn"); exit(1); int on = 1; setsockopt(sock1, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on); struct sockaddr_in bcAddr; memset(&bcAddr, 0, sizeof(bcAddr); bcAddr.sin_family = AF_INET; int rtnVal = inet_pton(AF_INET, bcIP, &bcAddr.sin_addr.s_addr); if (rtnVal = 0) printf("inet_pton() failed, invalid address stringn"); exit(1); else if (rtnVal < 0) printf("inet_pton() failedn"); exit(1); bcAddr.sin_port = htons(bcPort); ssize_t numBytes1=sendto(sock1,username, strlen(username), 0, (struct sockaddr*)&bcAddr, sizeof(bcAddr); if (numBytes1 < 0) printf("sendto() failedn"); exit(1); ssize_t numBytes2=sendto(sock1, "Hello!", strlen("Hello!"), 0, (struct sockaddr*)&bcAddr, sizeof(bcAddr); if (numBytes2 < 0) printf("sendto() failedn"); exit(1); while(1) char strMsg256 = 0; printf("you say:"); /scanf("%s",strMsg); fgets(strMsg, 256, stdin); if(strcmp(strMsg,"quitn")=0) memset(strMsg, strlen(strMsg),0); ssize_t numBytes3= sendto(sock1,username, strlen(username), 0, (struct sockaddr*)&bcAddr, sizeof(bcAddr); if (numBytes3 < 0) printf("sendto() failedn"); exit(1); ssize_t numBytes4=sendto(sock1,"Bye!n", strlen("Bye!"), 0, (struct sockaddr*)&bcAddr, sizeof(bcAddr); if (numBytes4 < 0) printf("sendto() failedn"); exit(1); exit(0); if(strcmp(strMsg,"n")=0); else ssize_t numBytes5 =sendto(sock1,username, strlen(username), 0, (struct sockaddr*)&bcAddr, sizeof(bcAddr); if (numBytes5 < 0) printf("sendto() failedn"); exit(1); ssize_t numBytes6 = sendto(sock1,strMsg , strlen(strMsg)-1, 0, (struct sockaddr*)&bcAddr, sizeof(bcAddr); if (numBytes6 < 0) printf("sendto() failedn"); exit(1); else if(pid = 0) /child process int sock2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock2 < 0) printf("socket() failedn"); exit(1); struct sockaddr_in servAddr; memset(&servAddr, 0, sizeof(servAddr); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(servPort); if (bind(sock2, (struct sockaddr*) &servAddr, sizeof(servAddr) < 0) printf("bind() failedn"); exit(1); while(1) struct sockaddr_in fromAddr; socklen_t fromAddrLen = sizeof(fromAddr); char buffer1BUFSIZE = 0; ssize_t numBytes7= recvfrom(sock2, buffer1, BUFSIZE, 0, (struct sockaddr *) &fromAddr, &fromAddrLen); if (numBytes7 < 0) printf("recvfrom() failedn"); exit(1); char *fromuser=buffer1; char buffer2BUFSIZE = 0; ssize_t numBytes8 = recvfrom(sock2, buffer2, BUFSIZE, 0, (struct sockaddr *) &fromAddr, &fromAddrLen); if (numBytes8 < 0) printf("recvfrom() failedn"); exit(1); if(strcmp(buffer2,"Hello!")=0) char ctime50 = 0; WriteLog("%s Received:%s 已进入聊天室!n", GetSysTime(ctime),fromuser); else if(strcmp(buffer2,"Bye!")=0) char ctime50 = 0; WriteLog("%s Received:%s 已离开聊天室!n", GetSysTime(ctime),fromuser); else char ctime50 = 0; WriteLog("%s %s say: %sn", GetSysTime(ctime),fromuser,buffer2); 专心-专注-专业