socket linux2

时间:2019-01-30 12:54:40
【文件属性】:

文件名称:socket linux2

文件大小:5KB

文件格式:C

更新时间:2019-01-30 12:54:40

linux,socket

客户端: #include #include // 包含套接字函数库 #include #include // 包含AF_INET相关结构 #include // 包含AF_INET相关操作的函数 #include #include #include #define PORT 6789 #define IP_ADDR "127.0.0.1" #define SIZE 10240 int main() { struct tm *timeptr; time_t timeval; //时间变量 char tm[50]; int sockfd; // 用于保存客户套接字标识符 int len; // 用于客户消息长度 struct sockaddr_in address; // 定义客户套接字地址结构体 int result; sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型 address.sin_family = AF_INET; // 定义套接字地址中的域 address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_addr.s_addr = inet_addr(IP_ADDR); // 定义套接字地址 address.sin_port = htons(PORT); // 定义套接字端口 char buf[100]; // 定义要传送的消息 memset(buf,0,100); char str[90]; //存贮输入的语句 char shmaddr[SIZE]; //接受服务器发送的全部聊天数据 int i=0; char myname[100]; char say[10]={"说:"}; printf("欢迎来到聊天室,请输入你的姓名:"); scanf("%s",myname); len = sizeof(address); result = connect(sockfd, (struct sockaddr *) &address, len); // 请求连接 if (result == -1) { perror("Connect failed"); return 1; } printf("%s成功登录服务器:\n",myname); pid_t pid; pid=fork(); if(pid==-1) { printf("fork failed"); } int sendbytes=0; if(pid==0) //子进程用于发送数据 { while(1) { scanf("%s",str); (void)time(&timeval); strcpy(tm,ctime(&timeval)); strcpy(buf,myname); //姓名传入buf中 strcat(buf,":"); strcat(buf,str); strcat(buf," ["); strcat(buf,tm); //时间传入buf中 strcat(buf,"]"); if((sendbytes=write(sockfd, buf, 100))==-1) { perror("send to server failed:"); } // 向服务器传送消息 usleep(1000); memset(buf,0,100); memset(tm,0,50); getchar(); } } if(pid>0) //父进程用于接受消息并读取 { while(1) { read(sockfd,shmaddr,SIZE); if(*(shmaddr+i*100)!=0) { printf("%s\n",(shmaddr+i*100)) ; i++; } usleep(1000); } } close(sockfd); return 0; } 服务器: #include #include // 包含套接字函数库 #include #include // 包含AF_INET相关结构 #include // 包含AF_INET相关操作的函数 #include #include #include #include #include #define PORT 6789 //定义端口号 #define MYKEY 12345 #define SIZE 10240 //定义共享内存的大小 int main(void) { int shmid; //共享内容的ID char *shmaddr; //定义子进程共用的共享内存 shmid = shmget(MYKEY, SIZE, IPC_CREAT | 0600);//创建共享内存 shmaddr= (char *) shmat(shmid, 0, 0);//通过共享内存ID获取共享内存起始地址 if(shmid==-1)//创建失败 { printf("shmid error\n"); } memset(shmaddr,0,SIZE); //置零 int i=0; char buf[100]; //存用户的输入消息 memset(buf,0,100); //置零 int server_sockfd,client_sockfd; //服务端socket,客户端socket int server_len,client_len;//socket长度 server_sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义服务端套接字类型 struct sockaddr_in server_sockaddr,client_sockaddr;//定义保存socket信息的结构体 //配置机构体信息 server_sockaddr.sin_family=AF_INET;//协议族使用tcp/ip server_sockaddr.sin_port=htons(PORT);//设置端口号 server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);//设置ip地址为本机地址 server_len=sizeof(server_sockaddr);//服务端结构体的长度 //允许重复使用本地地址和套接字绑定 int j=1; setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j)); //绑定端口 将结构体地址信息绑定到socket的上 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)==-1) { perror("bind:"); exit(1); } //对带信息的socket进行监听 if(listen(server_sockfd,5)==-1)//失败返回-1 { perror("listen:"); exit(1); } printf("服务器正在监听中,等待用户接入......\n");//输出提示 client_len=sizeof(client_sockaddr);//客户端结构体长度 pid_t ppid,pid;//进程号 while(1) { //等待客户端连接 if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_sockaddr,&client_len))==-1) //server_sockfd为被监听的socket, client_sockaddr用来保存接入主机的信息,&client_len为指 向sizeof(client_sockaddr)的指针 //此函数出错返回-1 { perror("accept error:"); exit(1); } printf("%s登录服务器\n",inet_ntoa(client_sockaddr.sin_addr));//用户接入成功 //inet_ntoa(client_sockaddr.sin_addr) ip地址转换 转换为数字点形式输出 ppid=fork();//接入一个客户 创建一个进程 if(ppid==-1)//创建进程失败 { printf("fork 1 failed:"); } if(ppid==0) //如果为子进程用于接收客户端信息并发送 { pid=fork();//创建一个子进程 if(pid==-1) { printf("fork 2 failed:"); exit(1); } int recvbytes; if(pid==0) //子子进程用于接收消息 { while(1) { //接收消息 if((recvbytes=recv(client_sockfd,buf,100,0))==-1)//接收失败 { perror("read client_sockfd failed:"); } usleep(10000);//挂起0.01秒 printf("client send buf=%s\n",buf);//输出接收的信息 for(i=0;i<1000;i++)//将接收的信息存入共享内存区 { if(*(shmaddr+100*i)==0)//此区域没有数据 { strcpy(shmaddr+100*i,buf); //存入接收的信息 break; } } }//end if(pid==0) } if(pid>0) //子父进程用于发送消息 { while(1) { if(*(shmaddr+i*100)!=0) { write(client_sockfd,shmaddr,SIZE);//将共享内存的数据全部发送给客户端 i++; } } } }//end if(ppid==0) if(ppid>0) //总父进程返回等待接收消息 { close(client_sockfd);关闭客户端socket } }//end while(1) return 0; }//end


网友评论