好久没有写这边的文章了, 作为一个IT界的新人. 最近因为升职的原因, 一直都好忙. 因为没有做过管理, 忽然到了这个位置上. 不适应是肯定的! 因为更喜欢钻研技术, 管理上欠缺的太多. 呵呵, 废话太多了. 切入正题.
最近需要计划做一个服务器的程序. 和我们用VC++开发的客户端程序做对接, 我在LINUX服务器下用C写了一段简单的服务器, 代码如下:
首先是头文件: CCServer.h
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFLEN 1024
#define SERVER_PORT 9696
#define BACKLOG 5
staticvoid* handle_request(void* argv);
staticvoidhandle_connect(int);
然后是CCServer.c
#include "CCServer.h"
#include "bt_iconv.h"
intmain(intargc,char* argv[])
{
ints_s;
structsockaddr_in local;
s_s = socket(AF_INET, SOCK_STREAM, 0);
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_port = htons(SERVER_PORT);
interr = bind(s_s, (structsockaddr *) &local,sizeof(local));
err = listen(s_s, BACKLOG);
handle_connect(s_s);
close(s_s);
return0;
}
staticvoid* handle_request(void* argv)
{
ints_c = * ((int*) argv);
time_tnow;
charbuff[BUFFLEN];
charm_buff[BUFFLEN];
while(1) {
intn = 0;
memset(buff, 0, BUFFLEN);
memset(m_buff, 0, BUFFLEN);
n = recv(s_c, buff, BUFFLEN, 0);
//printf("接收到%s \r\n", buff);
if(n > 0)
{
GB2312ToUTF8(buff, m_buff, strlen(buff) + 100);
printf("接收到:%s\n", m_buff);//测试的代码
send(s_c, buff, strlen(buff), 0);
}
close(s_c);
}
}
staticvoidhandle_connect(ints_s)
{
ints_c;
structsockaddr_in from;
intlen =sizeof(from);
pthread_t thread_do;
while(1)
{
s_c = accept(s_s, (structsockaddr *) &from, &len);
if(s_c > 0)
{
interr = pthread_create(&thread_do,
NULL,
handle_request,
(void*) &s_c);
}
}
}
中间因为LINUX使用的是UTF-8的编码, 而在win下我用的是多字节字符集. 就必须要一段字符集转换的代码. 主要是因为我对VC++不熟悉, 所以只能是在LINUX下转换了. 上代码 bt_iconv.h
#include
#include
#include
#include
externintGB2312ToUTF8(char* srcStr,char* desBuff,size_tdesBuffLength);
externintUTF8ToGB2312(char* srcStr,char* desBuff,size_tdesBuffLength);
最近是 bt_iconv.c:
#include "bt_iconv.h"
externintUTF8ToGB2312(char* srcStr,char* desBuff,size_tdesBuffLength)
{
assert(strlen(srcStr) > 0);
size_tiLen = strlen(srcStr);
iconv_t cd;
cd = iconv_open("gb2312","utf-8");
assert(cd != 0);
iconv(cd, &srcStr, &iLen, &desBuff, &desBuffLength);
iconv_close(cd);
returndesBuffLength;
}
externintGB2312ToUTF8(char* srcStr,char* desBuff,size_tdesBuffLength)
{
assert(strlen(srcStr) > 0);
size_tiLen = strlen(srcStr);
iconv_t cd;
cd = iconv_open("utf-8","gb2312");
assert(cd != 0);
iconv(cd, &srcStr, &iLen, &desBuff, &desBuffLength);
iconv_close(cd);
returndesBuffLength;
}
然后就是编译下就OK了, 测试没基本没有问题.
[cwork@localhost CCServer]$ gcc -o socketServerDemo CCServer.h CCServer.c -lpthread
完成 !
转载请注明来自派啦网.