linux c 多线程 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

static void * handle_request(void * argv);

static void handle_connect(int);

然后是CCServer.c

#include "CCServer.h"

#include "bt_iconv.h"

int main(int argc, char * argv[])

{

int s_s;

struct sockaddr_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);

int err = bind(s_s, (struct sockaddr *) &local, sizeof(local));

err = listen(s_s, BACKLOG);

handle_connect(s_s);

close(s_s);

return 0;

}

static void * handle_request(void * argv)

{

int s_c = * ((int *) argv);

time_t now;

char buff[BUFFLEN];

char m_buff[BUFFLEN];

while (1) {

int n = 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);

}

}

static void handle_connect(int s_s)

{

int s_c;

struct sockaddr_in from;

int len = sizeof(from);

pthread_t thread_do;

while (1)

{

s_c = accept(s_s, (struct sockaddr *) &from, &len);

if (s_c > 0)

{

int err = pthread_create(&thread_do,

NULL,

handle_request,

(void *) &s_c);

}

}

}

中间因为LINUX使用的是UTF-8的编码, 而在win下我用的是多字节字符集. 就必须要一段字符集转换的代码. 主要是因为我对VC++不熟悉, 所以只能是在LINUX下转换了. 上代码 bt_iconv.h

#include

#include

#include

#include

extern int GB2312ToUTF8(char * srcStr, char * desBuff, size_t desBuffLength);

extern int UTF8ToGB2312(char * srcStr, char * desBuff, size_t desBuffLength);

www.it165.net最近是 bt_iconv.c:

#include "bt_iconv.h"

extern int UTF8ToGB2312(char * srcStr, char * desBuff, size_t desBuffLength)

{

assert(strlen(srcStr) > 0);

size_t iLen = strlen(srcStr);

iconv_t cd;

cd = iconv_open("gb2312", "utf-8");

assert(cd != 0);

iconv(cd, &srcStr, &iLen, &desBuff, &desBuffLength);

iconv_close(cd);

return desBuffLength;

}

extern int GB2312ToUTF8(char * srcStr, char * desBuff, size_t desBuffLength)

{

assert(strlen(srcStr) > 0);

size_t iLen = strlen(srcStr);

iconv_t cd;

cd = iconv_open("utf-8", "gb2312");

assert(cd != 0);

iconv(cd, &srcStr, &iLen, &desBuff, &desBuffLength);

iconv_close(cd);

return desBuffLength;

}

然后就是编译下就OK了, 测试没基本没有问题.

[cwork@localhost CCServer]$ gcc -o socketServerDemo CCServer.h CCServer.c -lpthread

完成 !

转载请注明来自派啦网.

本文出自 “Typedef” 博客,请务必保留此出处http://typedef.blog.51cto.com/3209600/901482

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值