一个简单的tcp程序。
时间:2010-08-28
来源:互联网
今天上午看了会儿网络编程方面的书,自己就试着写写书上的代码,和我想得一样,错误很多。自己便改了下,粘在这里,并说明一下吧!或许对其他人有帮助
服务器端程序:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#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<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#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变量时,最好提前初始化为零。
其他的东西好像任意找一本有关网络编程的书都可以找到,我再说就显得多余了。
就这些,我有个毛病,说话罗罗嗦嗦的,希望这次会好点
服务器端程序:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#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<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#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变量时,最好提前初始化为零。
其他的东西好像任意找一本有关网络编程的书都可以找到,我再说就显得多余了。
就这些,我有个毛病,说话罗罗嗦嗦的,希望这次会好点
作者: xiaoqing87316 发布时间: 2010-08-28
我无语了
这样的程序也值当发个帖子。
这样的程序也值当发个帖子。

作者: zqy1005 发布时间: 2010-08-29
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28