免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3057 | 回复: 8
打印 上一主题 下一主题

[C] [求助]Socket网络编程的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-02 12:26 |只看该作者 |倒序浏览
这是我写的一段代码,实现通过Socket,即可以收消息,也可以随时发消息.
但是问题是,现在代码在运行到Read那里,也就是等待用于输入的时候,是阻塞的,如果不输入消息发出去,外面的消息就收不到.有高手可以指点一下吗,实现随时同时收发消息.
int main(int argc, char** argv)
{
    struct sockaddr_in sa;
    struct sockaddr_in to;
    int srcsock;
    int bindld, selectld,recvld;
    char buff[1024];
    char sendbuff[1024];
    int port = 1234;
    int sendport = 4321;
    int len;
    struct timeval timeout = {1,0};
    fd_set readfds,writefds;

    srcsock = socket(AF_INET, SOCK_DGRAM, 0);
    if(srcsock < 0)
    {
        printf("socket set up error!\n");
        return -1;
    }
   
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr("172.16.16.60");
    sa.sin_port = htons(port);
   
    to.sin_family = AF_INET;
    to.sin_addr.s_addr = inet_addr("172.16.30.3");
    to.sin_port = htons(sendport);

    bindld = bind(srcsock, (struct sockaddr *)&sa, sizeof(struct sockaddr_in));
    if(bindld < 0)
    {
        printf("bind error!\n");
        return -1;
    }
   
    while(1)
    {
        FD_ZERO(&writefds);
        FD_SET(srcsock, &writefds);
        memcpy(&readfds, &writefds, sizeof(fd_set));

        selectld = select(srcsock + 1, &readfds, &writefds, NULL, 0);
        if(selectld < 0)
        {
             printf("select error!\n");
             return -1;
        }
        
        if(FD_ISSET(srcsock, &readfds))
        {
             struct sockaddr_in from;
             socklen_t fromlen = sizeof(from);
             memset(buff, 0, 1024);

             recvld = recvfrom(srcsock, buff, sizeof(buff) - 1, 0, (struct sockaddr *) &from, &fromlen);
             if(recvld < 0)
             printf("revice message error!\n");
             else
             {  
                  buff[recvld] = 0;
                  printf("recive message from %s\nmessage is: %s\n",inet_ntoa(from.sin_addr), buff);
             }
        }
        
         if(FD_ISSET(srcsock, &writefds))
         {
             memset(sendbuff,0,1024);
             printf("enter msg:\n");
             len = read(STDIN_FILENO, sendbuff, sizeof(sendbuff));
             sendto(srcsock, sendbuff, len, 0, (struct sockaddr *) &to, sizeof(struct sockaddr_in));
         }
    }
   
}

论坛徽章:
0
2 [报告]
发表于 2011-06-02 12:37 |只看该作者
为什么不把fileno(STDIN_FILENO)也加入到readfds中呢

论坛徽章:
0
3 [报告]
发表于 2011-06-02 12:37 |只看该作者
为什么不把fileno(STDIN_FILENO)也加入到readfds中呢

论坛徽章:
0
4 [报告]
发表于 2011-06-02 12:37 |只看该作者
为什么不把fileno(STDIN_FILENO)也加入到readfds中呢

论坛徽章:
0
5 [报告]
发表于 2011-06-02 16:20 |只看该作者
if(FD_ISSET(srcsock, &writefds))
pthread_create();

论坛徽章:
0
6 [报告]
发表于 2011-06-02 22:42 |只看该作者
试试异步io

论坛徽章:
0
7 [报告]
发表于 2011-06-03 17:30 |只看该作者
多线程

论坛徽章:
0
8 [报告]
发表于 2011-06-30 13:38 |只看该作者
晕死,这种问题。socket既要收又要发,肯定要做多线程啊。一个线程负责收,一个线程负责发,二者完全独立工作。想想你程序,你做成阻塞方式的,write不了肯定read不到,进程挂起了,当然不往下走了。socket编程一般采用非阻塞方式,没有数据就接着再监测,而不是让进程在那里挂起。另外,一般read的时候我们是被动采用非阻塞方式的select,write我们是主动的一般不需要做任何监测直接发送就ok了。

论坛徽章:
0
9 [报告]
发表于 2011-06-30 22:33 |只看该作者
回复 8# cicy821@126.com

很好,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP