您的位置:首页 > 运维架构 > Linux

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: