【文件属性】:
文件名称: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