| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1444 人关注过本帖
标题:关于recvfrom()的问题
只看楼主 加入收藏
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:8 
关于recvfrom()的问题
执行这条语句时,计算机等待接受数据不往下执行了吗????
在双核计算机上,如果在recvfrom()后面加上printf("hhhh\n"),一运行就会有若干条“hhhh”显示。谁能解释下啊
尤其是服务端,客户端好像从没出现这种情况
搜索更多相关主题的帖子: 计算机 服务端 客户端 
2011-05-09 11:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
看你的socket设置,是否为 阻塞
2011-05-09 11:49
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:5 
异步模式了?

我们都在路上。。。。。
2011-05-09 13:34
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
收藏
得分:0 
在单核情况下不会出现这种情况
2011-05-09 17:41
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <Winsock2.h>
#include <Windows.h>
    SOCKADDR_IN cln_in;
    SOCKADDR_IN sock_in;
    int cz=sizeof(SOCKADDR_IN);
    SOCKET ser_socket;

    DWORD CALLBACK New_Thread(LPVOID lpParameter);
void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
   
    wVersionRequested = MAKEWORD( 2, 2 );
   
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
   
        return;
    }
   
   
    if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
       
        WSACleanup( );
        return;
    }
    ser_socket=socket(AF_INET,SOCK_DGRAM,0);
    HANDLE hThread=CreateThread(NULL,0,New_Thread,0,0,0);
    CloseHandle(hThread);

    sock_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    sock_in.sin_family=AF_INET;
    sock_in.sin_port=htons(9527);
    
    bind(ser_socket,(SOCKADDR*)&sock_in,sizeof(SOCKADDR_IN));
       char sendbuf[200];
    while(1)
    {
        gets(sendbuf);

    sendto(ser_socket,sendbuf,200,0,(SOCKADDR*)&cln_in,cz);
    }
    closesocket(ser_socket);
}

    DWORD CALLBACK New_Thread(LPVOID lpParameter)
{
        char recvbuf[200]={'\0'};
    char fobuf[300];
    while(true)
    {
        recvfrom(ser_socket,recvbuf,200,0,(SOCKADDR*)&cln_in,&cz);
        printf("hhhh\n");
        sprintf(fobuf,"%s say:%s",inet_ntoa(cln_in.sin_addr),recvbuf);
        printf("%s\n",fobuf);
    }
};


以上是代码

[ 本帖最后由 安普留香 于 2011-5-10 11:53 编辑 ]
2011-05-10 11:48
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <Winsock2.h>
#include <Windows.h>

SOCKET cln_socket;
SOCKADDR_IN addr;
SOCKADDR_IN ser_addr;
int cz=sizeof(SOCKADDR_IN);
DWORD CALLBACK New_Thread(LPVOID lpParameter);
void main()
{
   
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
   
    wVersionRequested = MAKEWORD( 2, 2 );
   
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return;
    }
   
    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */
   
    if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        WSACleanup( );
        return;
    }
    cln_socket=socket(AF_INET,SOCK_DGRAM,0);
    //HANDLE h_thread=CreateThread(NULL,0,New_Thread,0,0,0);
    //CloseHandle(h_Thread);

    ser_addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    ser_addr.sin_port=htons(9527);
    ser_addr.sin_family=AF_INET;
    char sendbuf[200]={'\0'};
    HANDLE h_Thread=CreateThread(NULL,0,New_Thread,0,0,0);
    CloseHandle(h_Thread);
    while(true)
    {
        gets(sendbuf);
        sendto(cln_socket,sendbuf,200,0,(SOCKADDR*)&ser_addr,cz);
    }
    closesocket(cln_socket);
}
DWORD CALLBACK  New_Thread(LPVOID lpParamter)
{
    char recvbuf[200]={'\0'};
    while(true)
    {
       
    recvfrom(cln_socket,recvbuf,200,0,(SOCKADDR*)&ser_addr,&cz);
    if(recvbuf[0]!='\0')
   
    {
    //printf("hhhh\n");
    printf("%s :%s\n",inet_ntoa(ser_addr.sin_addr),recvbuf);
    }
    }
}
以上是客户端代码
最后一个问题
为什么客户端发送一次数据之后才能接受到服务端的数据
2011-05-11 19:45
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:5 
LZ应该先将基础知识学好。
你5L贴的代码那些明显错误是不可饶恕的
并且在5L也能看出你对socket的不了解,6L虽然改了些,依然让人、、有书得话好好看书,对比着看哪里有问题,学着自己调试,也注意自己的代码格式,解决方法。别忘了还有MSDN,baidu,google.

离恨恰如春草,更行更远还生。
2011-05-11 21:22
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
收藏
得分:0 
以上代码都已经通过编译,正常运行
请楼上指出错误
2011-05-12 22:01
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
收藏
得分:0 
还有问题是
1 为什么双核情况下服务端会先输出若干,单核运行情况则不会
2 客户端要发送一次数据之后,才能正常接收到服务端数据
哪位知道指点下
2011-05-12 22:08
快速回复:关于recvfrom()的问题
数据加载中...
 
   



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

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