SOCKET网络编程:Linux下实现聊天室_第1页
SOCKET网络编程:Linux下实现聊天室_第2页
SOCKET网络编程:Linux下实现聊天室_第3页
SOCKET网络编程:Linux下实现聊天室_第4页
SOCKET网络编程:Linux下实现聊天室_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SOCKET网络编程:Linux下实现聊天室程序介绍:本聊天室程序在Ubuntu下,采用C语言实现,结构为 Client/Server结构;服务端程序通过共享存储区存储聊天数据,并发送给每个连接的客户端;服务端程序和客户端程序都是通过父子进程分别负责发送和接收数据的,以避免数据冲撞; 需按以下格式调用客户端程序:client.exe服务端主机IP端口号(本程序设定为:3490)用户名(在聊天室中显示的用户名)。程序截图:/ 服务端/ 客户端1:真水无香/客户端2:蜡笔小新zhenshui007ubuntu: T臬面=p1文件编辑(E)童看呵终端帮濒旦)zhenshuiee7ubuntu:*/面

2、$,/client.exe 222.26.193.117 3496 |%小新|-Welcometo the chat rooml |冑水无香:大家好(21:5:37)晚上好缗笔小新:晚上好(21:5:44)程序代码如下:/客户端2:蜡笔小新/客户端2:蜡笔小新/server.c/客户端2:蜡笔小新/包含工程所需的头文件#include #include /数据类型定义/定义数据结构sockaddr_in/提供socket函数及数据结构#include #include #include #include #include #include #include #include #include

3、#include #include #define PERM S_IRUSR|S_IWUSR#define MYPORT 3490 /宏定义定义通信端口#define BACKLOG 10 /宏定义,定义服务程序可以连接的最大客户数量/宏定义,当客户端连接服#define WELCOME|Welcome to the chat room!1务端时,想客户发送此欢迎字符串/转换函数,将int类型转换成char *类型void itoa( int i, char *string) int powerj;j=i;for (power=1;j=10;j/=10)power*=10;for (;powe

4、r0;power/=10)*string+= 0 +i/power;i%=power;*string= 0 ;/ 得到当前系统时间 void get_cur_time( char * time_str) time_t timep;struct tm *p_curtime; char *time_tmp;time_tmp=( char *)malloc(2); memset(time_tmp,0,2);memset(time_str,0,20); time(&timep);p_curtime = localtime(&timep); strcat(time_str, ( ); itoa(p_cu

5、rtime-tm_hour,time_tmp); strcat(time_str,time_tmp); strcat(time_str, : ); itoa(p_curtime-tm_min,time_tmp); strcat(time_str,time_tmp); strcat(time_str, : ); itoa(p_curtime-tm_sec,time_tmp); strcat(time_str,time_tmp); strcat(time_str, ) ); free(time_tmp);/ 创建共享存储区 key_t shm_create()key_t shmid;/shmid

6、= shmget(IPC_PRIVATE,1024,PERM);if (shmid = shmget(IPC_PRIVATE,1024,PERM) = -1) ,strerror(errno);fprintf(stderr, Create Share Memory Error:%sna exit(1);return shmid;/ 端口绑定函数 , 创建套接字,并绑定到指定端口 int bindPort( unsigned short int port)int sockfd;struct sockaddr_in my_addr;sockfd = socket(AF_INET,SOCK_STRE

7、AM,0); / 创建基于流套接字 my_addr.sin_family = AF_INET;/IPv4 协议族my_addr.sin_port = htons(port); / 端口转换 my_addr.sin_addr.s_addr = INADDR_ANY;bzero(&(my_addr.sin_zero),0);if (bind(sockfd,( struct sockaddr*)&my_addr, sizeof ( struct sockaddr) = -1)perror( bind );exit(1);printf( bing success!n );return sockfd;i

8、nt main( int argc, char *argv)int sockfd,clientfd,sin_size,recvbytes; / 定义监听套接字、客户套接字pid_t pid,ppid; / 定义父子线程标记变量char *buf, *r_addr, *w_addr, *temp, *time_str; /=0; / 定义临时存储区 struct sockaddr_in their_addr; / 定义地址结构key_t shmid;shmid = shm_create();/ 创建共享存储区temp = ( char *)malloc(255);time_str=( char

9、*)malloc(20);sockfd = bindPort(MYPORT); / 绑定端口while (1)if (listen(sockfd,BACKLOG) = -1) / 在指定端口上监听perror( listen );exit(1);printf( listeningn );/ 接收客户if (clientfd = accept(sockfd,( struct sockaddr*)&their_addr,&sin_size) = -1) 端连接perror( accept );exit(1);printf( accept from:%dn ,inet_ntoa(their_addr

10、.sin_addr);send(clientfd,WELCOME,strlen(WELCOME),0); / 发送问候信息 buf = ( char *)malloc(255);ppid = fork();/ 创建子进程if (ppid = 0)/printf(ppid=0n);pid = fork();/ 创建子进程while (1)if (pid 0)/ 父进程用于接收信息memset(buf,0,255);/printf(recvn);/sleep(1);if (recvbytes = recv(clientfd,buf,255,0) = 0)perror( recv1 );close(

11、clientfd);raise(SIGKILL);exit(1);/write bufs data to share memoryw_addr = shmat(shmid, 0, 0);memset(w_addr, 0 , 1024);strncpy(w_addr, buf, 1024);get_cur_time(time_str);strcat(buf,time_str);printf( %sn ,buf);else if (pid = 0)/ 子进程用于发送信息/scanf(%s,buf);sleep(1);r_addr = shmat(shmid, 0, 0);/printf(-%sn,

12、r_addr);/printf(cmp:%dn,strcmp(temp,r_addr);if (strcmp(temp,r_addr) != 0)strcpy(temp,r_addr);get_cur_time(time_str);strcat(r_addr,time_str);/printf(discriptor:%dn,clientfd);/if(send(clientfd,buf,strlen(buf),0) = -1)if (send(clientfd,r_addr,strlen(r_addr),0) = -1)perror( send );memset(r_addr, 0 , 102

13、4); strcpy(r_addr,temp);elseperror( fork );printf( n );free(buf);close(sockfd);close(clientfd);return 0;/client.c/ 包含工程所需的头文件#include #include / 定义数据结构 sockaddr_in#include / 提供 socket 函数及数据结构#include / 数据类型定义#include #include #include #include #include #include int main( int argc, char *argv)struct

14、sockaddr_in clientaddr;/ 定义地址结构pid_t pid;int clientfd,sendbytes,recvbytes; / 定义客户端套接字struct hostent *host;char *buf,*buf_r;if (argc h_addr);bzero(&(clientaddr.sin_zero),0);/ 连接if (connect(clientfd,( struct sockaddr *)&clientaddr, sizeof ( struct sockaddr) = -1) 服务端perror( connectn );exit(1);buf=( ch

15、ar *)malloc(120); memset(buf,0,120);buf_r=( char *)malloc(100);if ( recv(clientfd,buf,100,0) = -1) perror( recv: );exit(1);printf( n%sn ,buf);pid = fork(); / 创建子进程while (1)if (pid 0)/ 父进程用于发送信息/get_cur_time(time_str);strcpy(buf,argv3); strcat(buf, : ); memset(buf_r,0,100);/gets(buf_r);fgets(buf_r,100,stdin);strncat(buf,buf_r,strlen(buf_r)-1);/strcat(buf,time_str);/printf(-%sn,buf);if (sendbytes = send(clientfd,buf,st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论