今天上午看了会儿网络编程方面的书,自己就试着写写书上的代码,和我想得一样,错误很多。自己便改了下,粘在这里,并说明一下吧!或许对其他人有帮助
服务器端程序:
#include
#include
#include
#include
#include
#include
#include
#define LISTENQ 5
#define MAXLINE 512
#define HOST_ADDR "222.22.19.51"
int main()
{
int listenfd,connfd;
socklen_t len;
struct sockaddr_in servaddr,cliaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd==0) {
printf("Socket created failed!\n");
return -1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=inet_addr(HOST_ADDR);
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
printf("bind failed!\n");
return -1;
}
printf("listening...\n");
listen(listenfd,LISTENQ);
while(1){
len=sizeof(cliaddr);
connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&len);
printf("connect from %s,port %d\n",inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));
ticks=time(NULL);
sprintf(buff,"%.24s\r\n",ctime(&ticks));
write(connfd,buff,strlen(buff));
close(connfd);
}
}
客户端程序:
#include
#include
#include
#include
#define MAXBUFFERSIZE 256
#define PORT 6666
#define HOST_ADDR "222.22.19.51"
int main()
{
int sockfd,n;
char recvbuff[MAXBUFFERSIZE];
struct sockaddr_in servaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
printf("Socket created failed!\n");
return -1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=inet_addr(HOST_ADDR);
printf("connecting...\n");
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
printf("Connect server failed!\n");
return -1;
}
while((n=read(sockfd,recvbuff,MAXBUFFERSIZE))>0){
recvbuff[n]=0;
fputs(recvbuff,stdout);
}
if(n<0){
printf("Read failed!\n");
return -2;
}
return 0;
}
平台 fedora 12 gcc 版本 4.4.4
简要说明一下程序
c/s程序目的:其中客户机使用流套接字向服务器请求日期和时间,服务器在接受到请求后,回答请求并显示客户的地址。
1 #define HOST_ADDR "222.22.19.51" 服务器ip 6666 端口 最好用宏定义端口(我没有这样用) htons(6666) 即host to net 即字节顺序的一个转换函数,s is short for ‘short’,还有htonl()、ntohs()、ntohl(), l for long ,函数不必细说。关于字节顺序的问题,就要分little—endian与big—endian了,估计大多数pc都是使用的intel构架的cpu,那就是小端机了即little—endian,而网络中的数据传输方式都使用了从高到低的big—endian,所以要经过转换。
2 inet_addr()函数的作用是将点分十进制ip地址转换成in_addr并以网络字节顺序返回。
3 还有一个函数,程序里面没有使用,但最好使用。bzero()具体我不再细说,google一下即可。
4 (struct sockaddr *)&servaddr 是强制类型转换,具体的可以google sockaddr和sockaddr_in
前面说过的bzero()函数与两者密切相关啊!使用sockaddr_in变量时,最好提前初始化为零。
其他的东西好像任意找一本有关网络编程的书都可以找到,我再说就显得多余了。
就这些,我有个毛病,说话罗罗嗦嗦的,希望这次会好点
阅读(897) | 评论(0) | 转发(0) |