怎么通过socket在客户端与服务器之间传文件(比如一个C文件)
时间:2010-08-24
来源:互联网
小弟刚学习socket通信,只知道一些皮毛,附上两段程序(server.c和client.c)
server.c
------------
复制代码
-----------------------------------------------------------------------------------------------------------------
client.c
---------
复制代码
-------------------------------------------------------------------------------------------------------
这两段程序的目的是客户端发一个“hello”给服务器,然后服务器把它显示出来!
假设编译后的可执行文件为server和client
在Linux下启动两个shell,先在一个shell下运行server.c:
./server
然后在另一个shell下运行client.c:
./client 127.0.0.1(这里利用环回地址)
-------------------------------------------------------------------------------------------------------
看一下输出:
服务器端:
socket success!,sockfd=3
bind success!
listening....
received a connection :helloP
这里有个问题,为什么会输出“helloP”
重点:怎么在上述的程序上进行修改,使得客户端可以发一个C文件到服务器端!
谢谢!
server.c
------------
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #define SERVPORT 3333
- #define BACKLOG 10
- #define MAX_CONNECTED_NO 10
- #define MAXDATASIZE 10
- int main()
- {
- struct sockaddr_in server_sockaddr,client_sockaddr;
- int sin_size,recvbytes;
- int sockfd,client_fd;
- int i;
- char buf[MAXDATASIZE];
- /**********************创建一个socket*******************/
- if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
- {
- perror("socket");
- exit(1);
- }
- printf("socket success!,sockfd=%d\n",sockfd);
- /*******************************************************/
- server_sockaddr.sin_family=AF_INET;
- server_sockaddr.sin_port=htons(SERVPORT);
- server_sockaddr.sin_addr.s_addr=INADDR_ANY;
- bzero(&(server_sockaddr.sin_zero),8);
- /**********************bind端口*************************/
- if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)) == -1)
- {
- perror("bind");
- exit(1);
- }
- printf("bind success!\n");
- /*******************************************************/
- /************************监听***************************/
- if(listen(sockfd,BACKLOG) == -1)
- {
- perror("listen");
- exit(1);
- }
- printf("listening....\n");
- /*******************************************************/
-
- if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size)) == -1)
- {
- perror("accept");
- exit(1);
- }
-
- if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0)) == -1)
- {
- perror("recv");
- exit(1);
- }
- printf("received a connection :%s\n",buf);
-
-
- close(sockfd);
- }
client.c
---------
- #include<stdio.h>
- #include<stdlib.h>
- #include<errno.h>
- #include<string.h>
- #include<netdb.h>
- #include<sys/types.h>
- #include<netinet/in.h>
- #include<sys/socket.h>
- #define SERVPORT 3333
- #define MAXDATASIZE 100
- void main(int argc,char *argv[])
- {
- int sockfd,sendbytes;
- char buf[MAXDATASIZE];
- struct hostent *host;
- struct sockaddr_in serv_addr;
- if(argc < 2)
- {
- fprintf(stderr,"Please enter the server's hostname!\n");
- exit(1);
- }
-
- if((host=gethostbyname(argv[1])) == NULL)
- {
- perror("gethostbyname error!");
- exit(1);
- }
-
- if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)
- {
- perror("socket");
- exit(1);
- }
-
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_port=htons(SERVPORT);
- serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
- bzero(&(serv_addr.sin_zero),8);
-
- if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
- {
- perror("connect");
- exit(1);
- }
-
- if((sendbytes=send(sockfd,"hello",5,0)) == -1)
- {
- perror("send");
- exit(1);
- }
- close(sockfd);
- }
这两段程序的目的是客户端发一个“hello”给服务器,然后服务器把它显示出来!
假设编译后的可执行文件为server和client
在Linux下启动两个shell,先在一个shell下运行server.c:
./server
然后在另一个shell下运行client.c:
./client 127.0.0.1(这里利用环回地址)
-------------------------------------------------------------------------------------------------------
看一下输出:
服务器端:
socket success!,sockfd=3
bind success!
listening....
received a connection :helloP
这里有个问题,为什么会输出“helloP”
重点:怎么在上述的程序上进行修改,使得客户端可以发一个C文件到服务器端!
谢谢!
作者: zhuqing_739 发布时间: 2010-08-24
Server :
char buf[MAXDATASIZE] = {0,};
Client:
char *s = "hello\n";
send (sockfd, s, strlen(s) 0);
或者
sizeof()
char buf[MAXDATASIZE] = {0,};
Client:
char *s = "hello\n";
send (sockfd, s, strlen(s) 0);
或者
sizeof()
作者: fanronghua 发布时间: 2010-08-24
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28