当前位置:  技术问答>linux和unix

100分socket 通讯问题

    来源: 互联网  发布时间:2016-03-06

    本文导语:  我在windows环境下已写好客户端,进行文件上传下载。 现在需要在LINUX应用中加上server端。 如果单独让服务器端为接受文件方或文件发送方。可以实现。 问题: 1.如何实现如何客户端选择上传,服务器端就会接收,  ...

我在windows环境下已写好客户端,进行文件上传下载。
现在需要在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;
}

|
1.客户端向服务器发送一条信息,告诉服务器是上传还是下载,服务器接受到信息后,分析,就知道是接收还是发送了
2.服务器端只要一个接受数据线程就可以解决这个问题了。 pthread_create
3.可以先启动客户端的,客户端向服务器发送连接请求,如果失败,则再次发送服务请求,直到成功为止。当
服务器接收到连接请求,就允许连接,创建个线程处理客户端事务

|
按我理解server端是不是有点问题。 应该是server端循环监听 客户端有请求后才才开启线程处理。

我理解是不是有问题啊?如果错了不要笑话我啊。

|
连接成功后,不能关闭套接字,如果关了,那么以后通讯怎么办?除非是客户端退出了,才关闭。

其次,考虑多个客户端连接,应该对每一个客户端连接,都创建一个线程去处理,客户端事务。

|
老兄,没你想得那么复杂吧

如果只想在服务端提供文件传输功能的话,服务端打开Linux的FTP服务就行,这样的话,你这些问题都不用考虑了
但客户端需完成FTP用户登录,传输模式设置,以及Get和Put等文件存取命令,以及接收服务端的返回的ACK来判断命令是否成功被执行。

|
lz 说了是用socket来实现阿,肯定不是用现成的FTP服务吧

|
建议找个简单的FTP源码(客户端和服务端)看下,基本的socket编程,不难的!

|
封装一个struct {
    int type;
    char szBuffer[BufferSize];
}

客户端每次发送这么一个结构。服务器收到后读取type的值然后决定是提供上传还是下载服务。

另外服务器端在收到连接请求时才开启线程。

我是这样想的,希望高手不要笑话我。

|
将buf的内容打出来,看看是否真的接受到了数据.

还有creat 只能以只读方式创建文件。建议用open

|
请问楼主使用的socket是设置为阻塞还是非阻塞方式 ?  是否有设置超时 ??  

建议楼主先温习下socket方面的知识, 另 楼主给出的代码写法不佳,有待改进! 

|
同意1楼的,最好用非阻塞方式来写

|
同意1楼所说,这个问题挺简单的。

    
 
 

您可能感兴趣的文章:

  • 请问rmi通讯和socket通讯有什么优劣和异同?
  • socket 通讯开发包 Simple Sockets
  • Socket网络高手请进,关于socket通讯.
  • 关于socket概念的理解问题! iis7站长之家
  • 关于socket 通讯问题,请进。。。
  • Applet和Socket如何通讯
  • *******求教高手SOCKET通讯问题!
  • 关于socket通讯的一个问题
  • sockets 通讯的 C++ 包 SpnetKit
  • socket双向通讯模式请教
  • windows和linux进行socket通讯问题(高手请进!)
  • 关于socket 通讯
  • 关于socket通讯的一个小小问题
  • Socket 通讯的问题,困扰了我很久。
  • socket通讯使用select的问题
  • java 与c++用socket通讯的问题??字符串不能接收到??急啊!
  • 求Servlet与applet通过socket通讯,相关资料或源码,网址都行!谢谢啦。
  • linux 与 windows 之间 socket 通讯问题
  • 要编写一个后台的socket通讯程序,各位有没有什么好的建议?
  • 一个java和vc通讯的socket问题求解,急
  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • socket编程 中的bind问题
  • 你是否可以回答Socket的问题?数据先后问题
  • 多进程socket编程问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • fgets用在SOCKET流上的问题
  • linux socket fd 写阻塞问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 我的ping程序怎么老是出现Socket operation on non-socket


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3