当前位置: 技术问答>linux和unix
100分socket 通讯问题
来源: 互联网 发布时间:2016-03-06
本文导语: 我在windows环境下已写好客户端,进行文件上传下载。 现在需要在LINUX应用中加上server端。 如果单独让服务器端为接受文件方或文件发送方。可以实现。 问题: 1.如何实现如何客户端选择上传,服务器端就会接收, ...
我在windows环境下已写好客户端,进行文件上传下载。
现在需要在LINUX应用中加上server端。
如果单独让服务器端为接受文件方或文件发送方。可以实现。
问题:
1.如何实现如何客户端选择上传,服务器端就会接收,
如何客户端选择下载,服务器端就会发送,
2.服务端如何启用一线程来处理上述问题。
3.测试时必须先启动服务端,再启动客户端。才能实现上传或下载。能否先启动客户端,怎么通知服务端,然后服务
端起个线程来实现需要的服务呢?
现在需要在LINUX应用中加上server端。
如果单独让服务器端为接受文件方或文件发送方。可以实现。
问题:
1.如何实现如何客户端选择上传,服务器端就会接收,
如何客户端选择下载,服务器端就会发送,
2.服务端如何启用一线程来处理上述问题。
3.测试时必须先启动服务端,再启动客户端。才能实现上传或下载。能否先启动客户端,怎么通知服务端,然后服务
端起个线程来实现需要的服务呢?
|
8楼正解,对于客户连接请求不多的情况下,可以采用多线程模式来处理客户的连接请求,对于每一个连接请求建立一个新的线程来处理,下面给出主函数框架,
#include
#include
#include
#include
#include
#include
#include
#include
#define LISTEN_PORT 80
void* thread_proc(void* sockCon); //线程处理函数声明
int main()
{
int err,len=sizeof(struct sockaddr);
int sockSrv,sockCon;
struct sockaddr_in addrSrv,addrClient;
pthread_t t_id;
pthread_attr_t attr;
sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addrSrv.sin_addr.s_addr = htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(LISTEN_PORT); //监听端口根据需要自己定义
err=bind(sockSrv,(struct sockaddr*)&addrSrv,sizeof(struct sockaddr));
if(err!=0){
perror("Bind Failed!n");
exit(1);
}
err=listen(sockSrv,SOMAXCONN);
if(err!=0){
perror("Listen Failed!n");
exit(1);
}
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程分离属性,线程结束后会自动释放资源
while(1)
{
sockCon=accept(sockSrv,(struct sockaddr *)&addrClient,&len);
if(sockCon==-1){
perror("accept Failedn");
}else{
pthread_create(&t_id, &attr, thread_proc,(void*)sockCon);
}
}
pthread_attr_destroy(&attr);
close(sockSrv);
exit(0);
}
void* thread_proc(void* sockCon)
{
int socket=(int)sockCon;
//处理客户连接请求
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#define LISTEN_PORT 80
void* thread_proc(void* sockCon); //线程处理函数声明
int main()
{
int err,len=sizeof(struct sockaddr);
int sockSrv,sockCon;
struct sockaddr_in addrSrv,addrClient;
pthread_t t_id;
pthread_attr_t attr;
sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addrSrv.sin_addr.s_addr = htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(LISTEN_PORT); //监听端口根据需要自己定义
err=bind(sockSrv,(struct sockaddr*)&addrSrv,sizeof(struct sockaddr));
if(err!=0){
perror("Bind Failed!n");
exit(1);
}
err=listen(sockSrv,SOMAXCONN);
if(err!=0){
perror("Listen Failed!n");
exit(1);
}
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//设置线程分离属性,线程结束后会自动释放资源
while(1)
{
sockCon=accept(sockSrv,(struct sockaddr *)&addrClient,&len);
if(sockCon==-1){
perror("accept Failedn");
}else{
pthread_create(&t_id, &attr, thread_proc,(void*)sockCon);
}
}
pthread_attr_destroy(&attr);
close(sockSrv);
exit(0);
}
void* thread_proc(void* sockCon)
{
int socket=(int)sockCon;
//处理客户连接请求
return 0;
}
|
1.客户端向服务器发送一条信息,告诉服务器是上传还是下载,服务器接受到信息后,分析,就知道是接收还是发送了
2.服务器端只要一个接受数据线程就可以解决这个问题了。 pthread_create
3.可以先启动客户端的,客户端向服务器发送连接请求,如果失败,则再次发送服务请求,直到成功为止。当
服务器接收到连接请求,就允许连接,创建个线程处理客户端事务
2.服务器端只要一个接受数据线程就可以解决这个问题了。 pthread_create
3.可以先启动客户端的,客户端向服务器发送连接请求,如果失败,则再次发送服务请求,直到成功为止。当
服务器接收到连接请求,就允许连接,创建个线程处理客户端事务
|
按我理解server端是不是有点问题。 应该是server端循环监听 客户端有请求后才才开启线程处理。
我理解是不是有问题啊?如果错了不要笑话我啊。
我理解是不是有问题啊?如果错了不要笑话我啊。
|
连接成功后,不能关闭套接字,如果关了,那么以后通讯怎么办?除非是客户端退出了,才关闭。
其次,考虑多个客户端连接,应该对每一个客户端连接,都创建一个线程去处理,客户端事务。
其次,考虑多个客户端连接,应该对每一个客户端连接,都创建一个线程去处理,客户端事务。
|
老兄,没你想得那么复杂吧
如果只想在服务端提供文件传输功能的话,服务端打开Linux的FTP服务就行,这样的话,你这些问题都不用考虑了
但客户端需完成FTP用户登录,传输模式设置,以及Get和Put等文件存取命令,以及接收服务端的返回的ACK来判断命令是否成功被执行。
如果只想在服务端提供文件传输功能的话,服务端打开Linux的FTP服务就行,这样的话,你这些问题都不用考虑了
但客户端需完成FTP用户登录,传输模式设置,以及Get和Put等文件存取命令,以及接收服务端的返回的ACK来判断命令是否成功被执行。
|
lz 说了是用socket来实现阿,肯定不是用现成的FTP服务吧
|
建议找个简单的FTP源码(客户端和服务端)看下,基本的socket编程,不难的!
|
封装一个struct {
int type;
char szBuffer[BufferSize];
}
客户端每次发送这么一个结构。服务器收到后读取type的值然后决定是提供上传还是下载服务。
另外服务器端在收到连接请求时才开启线程。
我是这样想的,希望高手不要笑话我。
int type;
char szBuffer[BufferSize];
}
客户端每次发送这么一个结构。服务器收到后读取type的值然后决定是提供上传还是下载服务。
另外服务器端在收到连接请求时才开启线程。
我是这样想的,希望高手不要笑话我。
|
将buf的内容打出来,看看是否真的接受到了数据.
还有creat 只能以只读方式创建文件。建议用open
还有creat 只能以只读方式创建文件。建议用open
|
请问楼主使用的socket是设置为阻塞还是非阻塞方式 ? 是否有设置超时 ??
建议楼主先温习下socket方面的知识, 另 楼主给出的代码写法不佳,有待改进!
建议楼主先温习下socket方面的知识, 另 楼主给出的代码写法不佳,有待改进!
|
同意1楼的,最好用非阻塞方式来写
|
同意1楼所说,这个问题挺简单的。