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

关于提高socket效率,select+多进程/多线程 付源码

    来源: 互联网  发布时间:2017-05-01

    本文导语:  hi,     小弟刚玩socket,日前完成了一个单个线程+select 的程序,大致功能就是可以将一个服务器A发送过来的内容转发到另一个服务器B同时将另一台服务器B发送过来的内容转发到这个服务器A。测试发现: 1.单向传...

hi,
    小弟刚玩socket,日前完成了一个单个线程+select 的程序,大致功能就是可以将一个服务器A发送过来的内容转发到另一个服务器B同时将另一台服务器B发送过来的内容转发到这个服务器A。测试发现:
1.单向传输1G文件,速率有8MB(百兆网口),但是双向同时传输文件,速率只有4MB
2.希望能将程序改成多进程的或者多线程的来提高速率(即吞吐量)

源码如下,小弟尝试在connect之后fork了2个子程序来实现(即一个进程只负责A-B,另一个只负责B-A)的操作,但是发现传文件的时候传不完就程序就断了,下面是我单个线程+select 的程序,有没高手指点一下如何修改???

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define SERVPORT 8090
#define MAXDATASIZE 1024



int do_con_n(char *address, int port)
{
int s;  
struct sockaddr_in sin;
fd_set set;
struct timeval timeo = {15, 0}; //time ou struct
socklen_t len = sizeof(timeo);
int retval;
int error;
int code;
  
  s=socket(AF_INET, SOCK_STREAM, 0);  
 // x=fcntl(s,F_GETFL,0);              // Get socket flags  
  fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK); //设置为非阻塞模式  
  memset(&sin, 0, sizeof(struct sockaddr_in));  
  sin.sin_family=AF_INET;  
  sin.sin_port=htons(port);  
  //sin.sin_addr.s_addr=name_resolve(address);  
  sin.sin_addr.s_addr = inet_addr(address);
  if(!sin.sin_addr.s_addr) return(-1);  
  //printf("ip: %sn",inet_ntoa(sin.sin_addr));  
  if(connect(s, (struct sockaddr *)&sin, sizeof(sin))!=0)
  {
   if (errno != EINPROGRESS) 
   { 
       printf("connect:normal network unreach!!");
       return -1;
    }
   
     FD_ZERO(&set);/*将set清零使集合中不含任何fd*/ 
   FD_SET(s,&set); /*将一个给定的文件描述符加入集合之中*/ 
   retval = select(s + 1, NULL, &set, NULL, &timeo);
   if (retval == -1) 
   {
     printf("select");
     return -1;
   } 
   else if(retval == 0) 
   {
     printf("timeoutn"); //这样的select等于是变成了再timeout时间内是阻塞模式,超过timeout就直接返回
     printf("%dn", time(NULL));
     return 0;
   }
   else
   {
    //printf("connected--->:[%d]n",retval);
    if (FD_ISSET(s, &set)) 
    {     
    error=0;
    len = sizeof(error);     
    code = getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len);     
    /* 如果发生错误,Solaris实现的getsockopt返回-1,   
     * 把pending error设置给errno. Berkeley实现的   
     * getsockopt返回0, pending error返回给error.    
     * 我们需要处理这两种情况 */    
    if (code 0)   
    {   
        /* 开始写*/
        written_bytes=write(fd, ptr, bytes_left);
        //printf("nin seasend:written_bytes=[%d]n",written_bytes);
        if(written_bytessockfd1?sockfd:sockfd1)+1);


ret = select( (sockfd>sockfd1?sockfd:sockfd1)+1, &rdfds, NULL, NULL, NULL );
if(ret0)
{
printf("rcv:[%s],rcvlen=[%d]n",rcv_buf,rcvlen);
//write(sockfd, snd_buf, strlen(snd_buf)+1);
/*if(write(sockfd1, rcv_buf, sizeof(rcv_buf))0)
{
printf("rcv1:[%s],rcvlen=[%d]n",rcv_buf,rcvlen1);
/*if(write(sockfd, rcv_buf, rcvlen1)

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎么才能提高一个进程能打开的描述符数量
  • 网络技术 iis7站长之家
  • 请推荐几本java的入门和提高书籍.
  • Oracle收购TimesTen 提高数据库软件性能
  • 请教如何提高SD卡的读写速度?
  • 请问在编写Java小应用程序的时候,有些功能用JavaScript实现是否可以提高效率呢?
  • JAVA提高~
  • 《jsp入门与提高》,
  • 提高cpu使用率
  • 怎样提高读取文件的速度?
  • 哪位结合原码说明下Linux内核开发人员是如何处心积虑的提高效率的
  • 急求redhat liunx8.0电子文档。(安装指南和入门指南和提高或相关的电子文档)
  • 如何提高Powerpc 8270嵌入式系统性能?
  • 只有256内存,如何让fc8响应速度提高?
  • **关于大数据量如何提高效率。
  • 十万火急!(100分) unix下如何提高Coll(网络发生碰撞的次数)
  • 关于提高Oracle数据库性能的四个错误认识
  • 如果要研究源代码以提高自己,哪一个开放源代码的软件比较合适?
  • 请各位帮忙:描述一些项目(要能提高编程水平,java水平)
  • @@@@@@@ 提两个80386保护编程方面的问题,为提高本版的贴子量尽点力 @@@@@@@@@@@
  • 如何提高LINUX4网卡的速度?


  • 站内导航:


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

    ©2012-2021,