linux socket 多进程 服务器,关于LINUX下C语言多线程并发Socket服务器的例子

好久没有写这边的文章了, 作为一个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

完成 !

转载请注明来自派啦网.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值