原创 linux socket编程的一些记录总结

2009-7-30 15:24 4027 8 10 分类: 软件与OS

在这上面花了一周多,先是思路上的致命错误,导致浪费较多时间,不过调整下很快的完成了自己所需要的代码。


期间碰到的几个比较大的问题自己做下记录:


1、bind函数的理解错误,这个一般是在服务端用来绑定端口,而我一直以为可以用函数inet_addr()指定接收的IP,其实这里只是假如你有双网卡的时候,有需要可以绑定其中一个IP,htonl(INADDR_ANY)或0最实在。


贴下一段初始化的代码


 bzero(&socket_info.server_addr, sizeof(socket_info.server_addr));  
 socket_info.server_addr.sin_family = AF_INET; 
 socket_info.server_addr.sin_addr.s_addr =  0; //htonl(INADDR_ANY);
 socket_info.server_addr.sin_port = htons(PORT); 


 socket_info.descriptor_TCP_server = socket(AF_INET, SOCK_STREAM , 0);//UDP: SOCK_DGRAM TCP:SOCK_STREAM
 if (socket_info.descriptor_TCP_server == -1) 
 {  
  perror ("socket call failed");  
  exit(errno); 
 }
 if(bind(socket_info.descriptor_TCP_server,     //将套接口和进程联系起来
  (struct sockaddr *)&socket_info.server_addr ,
     sizeof(socket_info.server_addr)) == -1 ) 
 { 
  perror("bind TCP");
  exit(errno);
 }


2、TCP与UDP的选择使用上,UDP速度快不管数据完整不,TCP其实可以理解成UDP加检测数据(个人观点)。而我需要检验数据,但是数据传输肯定是要用UDP,所以一开始是想纯用UDP实现,当然需要自己写检验的相关代码,后来发现还要来回连接,麻烦哦...咨询了一同事的思路:TCP+UDP,TCP管连接和来回的要求重发数据等操作,而UDP则只管发送数据,效果感觉还行。至少比用纯UDP做实在。


3、TCP的connect函数


int connect_server(void)
{
 int savefl, ret;
 fd_set set;
 struct timeval tival;
 tival.tv_sec = 10;
 tival.tv_usec = 0; 


//设置为非阻塞
 savefl = fcntl(socket_info.socket_descriptor_TCP, F_GETFL);
 if( fcntl(socket_info.socket_descriptor_TCP, F_SETFL,  savefl | O_NONBLOCK) == -1)
 {
  perror("trying to set input socket to non-blocking");
  return 1;
 } 
//连接成功 
 if (connect(socket_info.socket_descriptor_TCP,
   (struct sockaddr *)&socket_info.address,
      sizeof(socket_info.address)) == 0)
 {
  if( fcntl(socket_info.socket_descriptor_TCP, F_SETFL, savefl) == -1)  //设置为阻塞
  {
   perror("trying to set input socket to blocking");
   return 1;
  } 
  return 0;
 }
 else
 {
  if (errno != EINPROGRESS)
  {
   count_connect ++;
   perror("Error: connect..2");
   goto err;
  }
  else
  {
   FD_ZERO(&set);  
   FD_SET(socket_info.socket_descriptor_TCP, &set); 
   ret = select(socket_info.socket_descriptor_TCP + 1, NULL, &set, NULL, &tival);
   if (ret == -1)
   {
    perror("Error: select");
    goto err;
   }
   else if(ret == 0)
   {
    fprintf(stderr, "timeout\n");
    goto err;
   }   
   if( ret > 0)
   {
    if(FD_ISSET (socket_info.socket_descriptor_TCP,&set))
    {
     int error = 0;
     socklen_t len = sizeof (error);
     if(getsockopt(socket_info.socket_descriptor_TCP, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
     {
      printf ("Error: getsockopt fail,connected fail\n");
      goto err;
     }   
     if (error == ETIMEDOUT) {
      printf ("Error: connected timeout\n");
      goto err;
     }
     if(error == ECONNREFUSED) {
      printf("Error: No one listening on the remote address.\n");
      goto err;
     }
    }
   }
  }


  if( fcntl(socket_info.socket_descriptor_TCP, F_SETFL, savefl) == -1)  //设置为阻塞
  {
   perror("trying to set input socket to blocking");
   return 1;
  } 
  return 0;
 } 
err:
 printf("errno:  %m  \n",errno);
 return 1;
}


4、UDP的recvfrom最好是非阻塞的。


 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1679196 2009-7-31 23:51

哇。 呵呵,共同学习。 不知道代码怎么调,粘贴过来很难看,博客上调代码有点麻烦,不知道大家有什么好办法。

tengjingshu_112148725 2009-7-31 09:24

谢谢原创经验
相关推荐阅读
用户1679196 2009-09-04 16:17
两个linux按键驱动之二 read(定时器去抖动)
//相比之下poll更为实用,但是这个代码实在太具有代表性了...涉及了下面几个知识。代码很大部分是linux设备驱动开发详解的内容。/*1、阻塞读取,队列概念2、睡眠等待中断产生3、定时器产生及相应...
用户1679196 2009-09-04 16:08
两个linux按键驱动之一 poll(未去抖动)
//驱动//未加去抖动//通过poll判断是否可读来得到中断值#include <linux/module.h> #include <linux/kernel.h>#inclu...
用户1679196 2009-09-04 09:39
select 使用
以下来自网络搜索:Linux下select调用的过程:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:offi...
用户1679196 2009-09-03 14:52
Linux设备驱动之定时器
Linux内核中定义了一个timer_list结构,我们在驱动程序中可以利用之: #include<linux/timer.h> struct timer_list { struct li...
用户1679196 2009-08-28 17:38
loff_t *ppos是什么东东
ssize_t generic_file_read(struct file * filp, char * buf, size_t count, loff_t *ppos) 这是一个文件读函数 我们很容...
用户1679196 2009-08-12 17:30
linux 延时函数几个资料
http://www.cppblog.com/CppExplore/archive/2008/04/02/46111.html一、 基础知识1、时间类型。Linux下常用的时间类型有4个:time_t...
EE直播间
更多
我要评论
2
8
关闭 站长推荐上一条 /3 下一条