博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

愿逝者安息 让生者前行 深切哀悼5.12遇难同胞

愿逝者安息 让生者前行 深切哀悼5.12遇难同胞
creatory.cublog.cn


Client/Server模型
Client/Server:
//Server.c
//designed by creatory@163.com
//April 3th,2008
//At Creatory Studio
//Server wait for connection from client,and send a string to client
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#define SERVER_PORT 5000
#define QUEUELEN 10
#define BUF_SIZE 256
struct package
{
int packsize;
char packbuf[BUF_SIZE];
};
int main(int argc,char **argv)
{
int listenfd,connfd;
char buf[BUF_SIZE];
time_t reachtime;
socketlen_t socklen;
struct sockaddr_in seradd,cliaddr;
struct package pack;
int i;
signal(SIGPIPE,SIG_IGN);
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("socket:%s\n",strerror(errno));
exit(1);
}
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(SERVER_PORT);
seraddr.sin_addr.s_addr=htons(INADDR_ANY);
if(bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr))<0)
{
printf("bind:%s\n",strerror(errno));
exit(1);
}
if((listen(listenfd,QUEUELEN))<0)
{
printf("listen:%s\n",strerror(errno));
exit(1);
}
while(1)
{
socklen=sizeof(cliaddr);
bzero(&cliaddr,sizeof(cliaddr));
printf("waiting for client to connect...\n");
connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&socklen);
if(connfd<0)
{
printf("accept:%s\n",strerror(errno));
break;
}
time(&reachtime);
printf("Time:%s ClientIP:%s Port:%d\n",ctime(&reachtime),inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
strcpy(pack.packbuf,"Welcome to connect creatory studio server\n");
pack.packsize=strlen(pack.packbuf);
pack.packsize*=10;
send(connfd,&pack.packsize,sizeof(int),0);
for(i=0;i<10;i++)
{
printf("Send to client %d time\n",i+1);
send(connfd,pack.packbuf,strlen(pack.packbuf),0);
}
close(connfd);
}
close(listenfd);
return 0;
}
出现错误:
server.c:In function main:
server.c:44:warning passing arg 3 of 'accept' makes pointer from integer with a cast
解决方法:
将accpet()函数中第三个参数由传值改为传地址即可.
gcc -Wall server.c -o server
出现错误:
管道断开
解决方法:
1.忽略信号
signal(SIGPIPE,SIG_IGN);
2.屏蔽信号
send(,,,MSG_NOSIGNAL);
//client.c
//client connect to server
//first it recv total bytes and designed to how many buffer it needs
//then it loop recv all the data from server
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#define SERVER_PORT 5000
#define BUF_SIZE 256
void usage(char *app)
{
printf("Uage:%s IPAddress\n",app);
}
int main(int argc,char **argv)
{
int listenfd,length,already;
struct sockaddr_in seraddr;
socklen_t socklen;
char buf[BUF_SIZE];
length=already=0;
if(argc<2)
{
usage(argv[0]);
exit(1);
}
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("socket:%s\n",strerror(errno));
exit(1);
}
bzero(&seraddr,sizeof(seraddr));
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(SERVER_PORT);
//convert ascii format ip address to numeric format(AsciiTONumeric)
inet_aton(argv[1],&seraddr.sin_addr);
socklen=sizeof(seraddr);
if(connect(listenfd,(struct sockaddr*)&seraddr,socklen)<0)
{
printf("connect:%s\n",strerror(errno));
exit(1);
}
recv(clifd,&length,sizeof(int),MSG_NOSIGNAL);
printf("%d Bytes Data Need To Be Receive\n",length);
already=recv(clifd,buf,BUF_SIZE,MSG_NOSIGNAL);
printf("%s",buf);
length-=already;
if(length>0 && length<=BUF_SIZE)
{
bzero(&buf,sizeof(buf));
already=recv(clifd,buf,length,MSG_NOSIGNAL);
printf("%s",buf);
length-=already;
}
close(listenfd);
return 0;
}

遗留问题:
当有大批量的数据传递时,必须考虑接受数据不受缓冲区大小的影响,一边接收,缓冲区满了,输出,清空缓冲区,再接收...这看起来麻烦,这个问题怎不考虑了,(实时数据传输),等以后遇到再说.很累了,调试这两个小程序用了2小时,回去休息一下....

发表于: 2008-04-03 ,修改于: 2008-04-03 17:59,已浏览133次,有评论0条 推荐 投诉


网友评论

发表评论