| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1413 人关注过本帖
标题:求一个程序异步套接口实现一对多通信
只看楼主 加入收藏
houchao
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-7-2
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
求一个程序异步套接口实现一对多通信
求一个程序异步套接口实现一对多通信
搜索更多相关主题的帖子: 接口 异步 通信 
2010-07-02 00:20
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:10 
是不是 就是 select()函数创建的套接字 通讯程序 ?

给你个框架吧
程序代码:
// VC6 2009-07-26
// server.cpp : 定义控制台应用程序的入口点。UDP
// UDP收包程序例子,基于非阻塞模式socket,并利用select() 实现接收超时
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include "protocol.h"

const int port = 8000;
const int LINE_LENTH = 20;
static states serverState = SERVER_IDLE_STATE;

int main()
{
    SOCKET socket1;
    WSADATA wsaData;
    int iErrorCode;
    CMesssage tmpMsg;
    //states oldState = serverState;
    initfsm();  // 初始化状态变迁表
    if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
    {
        printf("Winsock无法初始化!\n");
        WSACleanup();
        return 0;
    }
    printf("服务器开始创建SOCKET。\n");
    struct sockaddr_in localAddr;
    struct sockaddr_in fromAddr;
    int fromlen = sizeof(fromAddr);
    localAddr.sin_family = AF_INET;
    localAddr.sin_port = htons(port);       ///监听端口
    localAddr.sin_addr.s_addr = INADDR_ANY; ///本机
    socket1=socket(AF_INET,SOCK_DGRAM,0);
    bind(socket1,(struct sockaddr*)&localAddr,sizeof(localAddr));
    unsigned long ul = 1;
    int ret;
    //设置为非阻塞模式
    ret = ioctlsocket (socket1, FIONBIO, (unsigned long*)&ul);
    if (ret == SOCKET_ERROR)
        return 0;
    //select 模型,即设置超时
    struct timeval timeout ;
    fd_set r;
    while (1)   
    {  
        FD_ZERO (&r);
        FD_SET (socket1, &r);
        timeout.tv_sec  = 9; //连接超时15秒
        timeout.tv_usec = 0;
        ret = select (0, &r, 0 , 0, &timeout);
        if ( ret <= 0 )
        {
            ret = WSAGetLastError();
            printf("select timeout,%d\n", ret);
            Sleep(1000);
            continue;
        }
        if( ret > 0)  // 未超时
        {
            char buffer[200]="\0";
            int revCount;
            printf("waiting for message from others-------------\n");
            revCount = recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&fromAddr,&fromlen); // UDP
            if (revCount != SOCKET_ERROR)
            {
                printf("Received datagram from %s--%s\n",inet_ntoa(fromAddr.sin_addr),buffer);
                for (int i=1; i < sizeof(buffer)  ; i++)
                {
                    printf("%.2x ", buffer[i-1]);
                    if ( (i % LINE_LENTH) == 0)
                        printf("\n");
                }
                printf("\n");
                // 协议解析
                 ............
            }
            else
            {
                int i = WSAGetLastError();
                printf("recv time out,error code:%d\n",i);
            }
        }
    }
    closesocket(socket1);
    return 1;
}


~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-04 00:40
wzla333
Rank: 4
来 自:火星
等 级:业余侠客
威 望:2
帖 子:185
专家分:237
注 册:2006-8-24
收藏
得分:10 
扔一个完整的结构吧  慢慢学 这个很简单的 这个模型可是我保存了好久的东西


IOCP.rar (12.99 KB)

我从来都非常缺少朋友,因为自己不善于表达,无论是工作,学习,生活,抑或是网络...ACG爱好者,标准一个无限接近30岁的大叔......
2010-07-08 10:06
快速回复:求一个程序异步套接口实现一对多通信
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027486 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved