注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

绿色圣光

~生活·自愚自乐~

 
 
 

日志

 
 

TCP网络编程基础示例小程序  

2011-03-01 19:54:57|  分类: 个人作品 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*服务器代码*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>

#define PORT 8888
#define BACKLOG 2

static int ss;

void sig_int(int sign)
{
printf("关闭服务器...\n");
close(ss);
exit(0);
}

void process_conn_server(void *argv)
{
int s = *((int *)argv);
ssize_t size=0;
char buffer[1024];

for (;;)
{
size = recv(s, buffer, 1024, 0);

if (size <= 0)
{
close(s);
return ;
}

sprintf(buffer, "总计 %d 个字节\n",size);
write(s, buffer, strlen(buffer)+1);
}
}

void thread_connect(int ss)
{
int sc;
struct sockaddr_in client_addr;
socklen_t addrlen = sizeof(struct sockaddr);
pthread_t thread_do;
pthread_attr_t thread_attr;

pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);

for (;;)
{
sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
if (sc > 0)
{
pthread_create(&thread_do, &thread_attr,
(void *)&process_conn_server, (void *)&sc);
}
}

pthread_attr_destroy (&thread_attr);
}

int main(void)
{
struct sockaddr_in server_addr;
int err, optval = 1;

signal(SIGINT,sig_int);

ss = socket(AF_INET, SOCK_STREAM, 0);
if (ss < 0)
{
printf("套接字错误!\n");
return -1;
}

err = setsockopt(ss, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
if (err)
{
perror("setsockopt()");
}

bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);

err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (err < 0)
{
printf("绑定出错!\n");
return -1;
}

err = listen(ss, BACKLOG);
if (err < 0)
{
printf("侦听出错!\n");
return -1;
}
thread_connect(ss);


return 0;
}

/*客户端代码*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>

#define PORT 8888

static int s;

void sig_int(int sign)
{
printf("\n好吧,退出客户端。\n");
close(s);
exit(0);
}

void sig_pipe(int sign)
{
printf("捕捉到信号SIGPIPE,连接服务器失败!\n"
"请检查服务器地址是否正确,服务器是否启动,"
"以及客户端与服务器的连接状态等。\n"
"现在,客户端程序退出!\n");
close(s);
exit(0);
}

void process_conn_client(int s)
{
ssize_t size = 0;
char buffer[1024];

for(;;)
{
size = read(0, buffer, 1024);
if (size > 0)
{
write(s, buffer, size);
size = read(s, buffer, 1024);
write(1, buffer, size);
}
}
}

int main(int argc, char *argv[])
{
struct sockaddr_in server_addr;

if(argc != 2)
{
printf("对不起,请输入正确的服务器IP地址\n");
return 0;
}

signal(SIGINT,sig_int);
signal(SIGPIPE,sig_pipe);

s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0)
{
printf("套接字错误!\n");
return -1;
}

bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);

inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
connect(s, (struct sockaddr*)&server_addr,sizeof(struct sockaddr));
process_conn_client(s);

return 0;
}
  评论这张
 
阅读(916)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017