编写一个TCP协议网络通信程序,要求在客户端读取文件/etc/passwd
的内容,传输到服务器端,服务器端接受并输出在终端上。
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<errno.h>
#include<sys/wait.h>
#include<unistd.h>
#include<pthread.h>
int main(){
int sockfd;
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(6666);
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket failure!");
exit(2);
}
if (connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1)
{
perror("connect failure!");
exit(3);
}
char buf[2047];
FILE *fp=NULL;
fp=fopen("/etc/passwd","r");
if(fp==NULL){
perror("read file failure!");
exit(4);
}
while(!feof(fp)){
fgets(buf,sizeof(buf),fp);
if (send(sockfd,buf,strlen(buf),0)==-1)
{
perror("send failure!");
exit(6);
}
sleep(0.1);
}
printf("send finish,client quit.\n");
fclose(fp);
close(sockfd);
exit(0);
}
服务器:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<errno.h>
#include<sys/wait.h>
#include<unistd.h>
void pthread_fun(int client_fd){
char buf[2047];
int recvbytes;
while(1){
if ((recvbytes=recv(client_fd,buf,sizeof(buf),0))==-1)
{
perror("recv failure!");
exit(1);
}
if (recvbytes==0)
{
printf("finish!client quit.\n");
break;
}
buf[recvbytes]='\0';
printf("%s",buf);
}
close(client_fd);
pthread_exit(0);
}
int main()
{
pthread_t id;
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket create failure!");
exit (3);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(6666);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd,(struct sockaddr *)&my_addr, sizeof(struct sockaddr))==-1)
{
perror("bind failure!");
exit(4);
}
printf("server starts. listening to port 6666\n");
if (listen(sockfd,10)==-1)
{
perror("listen failure!");
exit(5);
}
while (1)
{
sin_size=sizeof(struct sockaddr);
if ((client_fd=accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("accept failure!");
exit(6);
}
pthread_create(&id,NULL,(void *)pthread_fun, (void *)client_fd);
}
close(sockfd);
exit(0);
}