- 论坛徽章:
- 0
|
功能比较简单,呵呵
服务端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int sock; /* POSIX用int 来描述socket */
/* 多线程 TCP chat 服务器*/
#define MAX_USERS 30
/* 在线用户表,用下标表示对应的socket, online_user[8] =1 ,表示socket fd =8的socket 在线,=0表示下线*/
char online_user[MAX_USERS];
/* 用来保护在线用户表 online_user*/
pthread_mutex_t user_lock;
void exit_handler(int sig)
{
close(sock);
pthread_mutex_destroy(&user_lock);
exit(0);
}
void * thread_fn(void *arg)
{
char buffer[1024];
int len,fd;
int client_sock = (int)arg;
while(1)
{
/* 接收客户端数据*/
len = recv(client_sock,buffer,sizeof(buffer)-1,0);
if(len 1)
{
port = (unsigned short )atoi(argv[1]);
}
/* ------------第一步:创建socket ----------------*/
sock = socket(PF_INET,SOCK_STREAM,0); /* ipv4,TCP,任意协议 */
if(sock == -1)
{
perror("socket");
exit(-1);
}
fprintf(stdout,"TCP char Server ,listen on %d,pit %d\n",port,getpid());
/* ----------------第二步:绑定端口和网卡----------------------*/
/* struct socketaddr_in 来指明这个SOCKET绑定在本地的哪一个的端口和哪一块网卡*/
memset((void *)&local_addr,0,sizeof(local_addr));
local_addr.sin_family = AF_INET ; /* ip v4 */
local_addr.sin_port = htons(port); /* 端口号,要用网络序*/
/* 可以取值 INADDR_ANY 表示这个socket可以这一台机器所有网卡上进行通信*/
/* 如果本机一个某一个网卡的IP地址,表示只在这一块网卡进行通信*/
local_addr.sin_addr.s_addr = INADDR_ANY; /* INADDR_ANY = 0x0 */
{
int val = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof (val));
}
if(bind(sock,(struct sockaddr *)&local_addr,sizeof(local_addr)) == -1)
{
perror("bind");
close(sock);
exit(-2);
}
/* ----------第三步:通知内核的PS开始侦听客户端请求-------------*/
if(listen(sock,20) == -1)
{
perror("listen");
close(sock);
exit(-3);
}
/* 清空在线用户表,初始化锁*/
for(i=0 ; i MAX_USERS)
{
char * close_msg = "online user too many";
fprintf(stdout,"new socket %d is too big,max user is %d\n",client_sock,MAX_USERS);
send(client_sock,close_msg,strlen(close_msg)+1,0);
close(client_sock);
continue;
}
/* 发送欢迎信息*/
send(client_sock,welcome_msg,strlen(welcome_msg)+1,0);
/* 把新联接的socket加入到在线用户表当中*/
pthread_mutex_lock(&user_lock);
online_user[client_sock] =1;
pthread_mutex_unlock(&user_lock);
fprintf(stdout,"client addr %s,port %d,sock %d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),client_sock);
pthread_create(&th,NULL,thread_fn,(void *)client_sock);
}
exit_handler(100);
}
客户端:代码比较简单
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/108685/showart_2134666.html |
|