linux服务器和客户端中文会话客户端
2016-01-02 15:21
597 查看
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include <errno.h>
#include <sys/msg.h>
#include<iconv.h>
#define PORT 6666
#define MAX_TEXT 512
struct msg_st
{
long msg_type;
char text[BUFSIZ];
};
int gb2312toutf8( char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen) {
iconv_t cd; if( (cd = iconv_open("utf-8","gb2312")) ==0 )
return -1; memset(destbuf,0,destlen);
char **source = &sourcebuf;
char **dest = &destbuf;
if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
return -1;
iconv_close(cd);
return 0;
}
int main(int argc,char **argv)
{
int ser_sockfd,cli_sockfd;
int err,n;
int addlen;
struct sockaddr_in ser_addr;
struct sockaddr_in cli_addr;
char recvline[200],sendline[200];
char *p;
/*****************************************************************************/
int msgid = -1;
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);//文件存储权限是0666
if(msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);//程序执行失败
}
/*****************************************************************************/
//建立服务器本地socket监听
ser_sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个socket
if(ser_sockfd==-1)
{
printf("socket error:%s\n",strerror(errno));
return -1;
}
int on;
on = 1;//打开这个ON
//它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟
//SO_REUSERADDR 允许重用本地地址和端口
setsockopt( ser_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
bzero(&ser_addr,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(PORT);
err=bind(ser_sockfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));//绑定本地IP和端口
if(err==-1)
{
printf("bind error:%s\n",strerror(errno));
return -1;
}
err=listen(ser_sockfd,5);//监听端口,这里范围不知道
if(err==-1)
{
printf("listen error\n");
return -1;
}
printf("listen the port:\n");
/*****************************************************************************/
pid_t pid;
char *message;
//两个fork创建了四个线程,接收中文乱码可能是因为大小端的问题
//还没弄懂进程的问题
//这里仅仅是手机客户端连接的进程
pid= fork();
fork();
if(pid < 0)
{
perror("fork failed\n");
exit(1);
}
/*****************************************************************************/
while(1)
{
addlen=sizeof(struct sockaddr);
//可以连接多个客户端
cli_sockfd=accept(ser_sockfd,(struct sockaddr *)&cli_addr,&addlen);//非阻塞
if(cli_sockfd==-1)
{
printf("accept error\n");
break;
}
printf("连接上\n");//连接上了,不需要这里返回数据,手机哪里就可以查得到
while(1)
{
memset(recvline,0,200);
n=recv(cli_sockfd,recvline,200,0);//阻塞IO
if(0==n)
{
printf("TCP断开连接\n");
break;
}
recvline
='\0';//这里一定要加字符串结束符号吗?
char line[200];//排除干扰
strcpy(line, recvline);
char dest_utf8[200];
//这里是把utf-8转换成GB2312
gb2312toutf8(line,strlen(line),dest_utf8,200);
printf("\nreceive data :%s\n",dest_utf8);
/*****************************************************************************/
if(strstr(recvline,"phone"))
{
//创建消息队列
struct msg_st data;
int msgid = -1;
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
//exit(EXIT_FAILURE);//没写???有问题不???
}
data.msg_type = 1;
strcpy(data.text, recvline);
if(msgsnd(msgid, (void*)&data, 200, IPC_NOWAIT) == -1)//不能大于1024
{
fprintf(stderr, "\n%d %s\n",errno,strerror(errno));
//exit(EXIT_FAILURE);
}
else
{
printf("\n加入消息队列成功\n");
}
}
/*****************************************************************************/
else
{
//可以过滤掉错误的信息
char sendline[]="the error data\n";
send(cli_sockfd,sendline,strlen(sendline),0);//发送失败>才返回-1,关掉了如何判断
}
usleep(50);
}
close(cli_sockfd);
}
close(ser_sockfd);
return 0;
}
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include <errno.h>
#include <sys/msg.h>
#include<iconv.h>
#define PORT 6666
#define MAX_TEXT 512
struct msg_st
{
long msg_type;
char text[BUFSIZ];
};
int gb2312toutf8( char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen) {
iconv_t cd; if( (cd = iconv_open("utf-8","gb2312")) ==0 )
return -1; memset(destbuf,0,destlen);
char **source = &sourcebuf;
char **dest = &destbuf;
if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))
return -1;
iconv_close(cd);
return 0;
}
int main(int argc,char **argv)
{
int ser_sockfd,cli_sockfd;
int err,n;
int addlen;
struct sockaddr_in ser_addr;
struct sockaddr_in cli_addr;
char recvline[200],sendline[200];
char *p;
/*****************************************************************************/
int msgid = -1;
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);//文件存储权限是0666
if(msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);//程序执行失败
}
/*****************************************************************************/
//建立服务器本地socket监听
ser_sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个socket
if(ser_sockfd==-1)
{
printf("socket error:%s\n",strerror(errno));
return -1;
}
int on;
on = 1;//打开这个ON
//它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟
//SO_REUSERADDR 允许重用本地地址和端口
setsockopt( ser_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
bzero(&ser_addr,sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(PORT);
err=bind(ser_sockfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));//绑定本地IP和端口
if(err==-1)
{
printf("bind error:%s\n",strerror(errno));
return -1;
}
err=listen(ser_sockfd,5);//监听端口,这里范围不知道
if(err==-1)
{
printf("listen error\n");
return -1;
}
printf("listen the port:\n");
/*****************************************************************************/
pid_t pid;
char *message;
//两个fork创建了四个线程,接收中文乱码可能是因为大小端的问题
//还没弄懂进程的问题
//这里仅仅是手机客户端连接的进程
pid= fork();
fork();
if(pid < 0)
{
perror("fork failed\n");
exit(1);
}
/*****************************************************************************/
while(1)
{
addlen=sizeof(struct sockaddr);
//可以连接多个客户端
cli_sockfd=accept(ser_sockfd,(struct sockaddr *)&cli_addr,&addlen);//非阻塞
if(cli_sockfd==-1)
{
printf("accept error\n");
break;
}
printf("连接上\n");//连接上了,不需要这里返回数据,手机哪里就可以查得到
while(1)
{
memset(recvline,0,200);
n=recv(cli_sockfd,recvline,200,0);//阻塞IO
if(0==n)
{
printf("TCP断开连接\n");
break;
}
recvline
='\0';//这里一定要加字符串结束符号吗?
char line[200];//排除干扰
strcpy(line, recvline);
char dest_utf8[200];
//这里是把utf-8转换成GB2312
gb2312toutf8(line,strlen(line),dest_utf8,200);
printf("\nreceive data :%s\n",dest_utf8);
/*****************************************************************************/
if(strstr(recvline,"phone"))
{
//创建消息队列
struct msg_st data;
int msgid = -1;
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
//exit(EXIT_FAILURE);//没写???有问题不???
}
data.msg_type = 1;
strcpy(data.text, recvline);
if(msgsnd(msgid, (void*)&data, 200, IPC_NOWAIT) == -1)//不能大于1024
{
fprintf(stderr, "\n%d %s\n",errno,strerror(errno));
//exit(EXIT_FAILURE);
}
else
{
printf("\n加入消息队列成功\n");
}
}
/*****************************************************************************/
else
{
//可以过滤掉错误的信息
char sendline[]="the error data\n";
send(cli_sockfd,sendline,strlen(sendline),0);//发送失败>才返回-1,关掉了如何判断
}
usleep(50);
}
close(cli_sockfd);
}
close(ser_sockfd);
return 0;
}
相关文章推荐
- LAMP环境的搭建
- linux(CentOS6)上mysql的安装、远程登录和使用以及mysql-python的实验
- linux io 内核图
- windows7 图形界面远程 centos6.5
- linux中list结构应用及构造hashtable进行英文文章单词数统计
- linux文件系统命令(4)---ls
- centos win7双系统安装,在win7已经安装的基础上
- centos7搭建LAMP平台环境
- Linux IPC实践(2) --匿名PIPE
- Linux IPC实践(1) -- 概述
- Linux信号实践(5) --时间与定时器
- Linux信号实践(4) --可靠信号
- Linux信号实践(3) --信号内核表示
- Linux/Ubuntu上使用Qt Creator创建非Qt项目
- linux0.11系列之(一): 实验环境搭建
- centos下一台机器多个Mysql实例
- CentOS系统启动流程
- CentOS系统启动流程
- linux系统中source命令
- linux io超详细