免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6705 | 回复: 2

[C] UDPServer与UDPClient [复制链接]

论坛徽章:
0
发表于 2011-06-14 11:32 |显示全部楼层
本帖最后由 青乡之b 于 2011-06-14 11:43 编辑

//initsock.h
//初始化winsock2库

#include<winsock2.h>
#pragma comment(lib,"WS2_32")

class CInitSock
{
public:
        CInitSock(BYTE minorVer=2,BYTE majorVer=2){
                WSADATA wsaData;
                WORD sockVersion=MAKEWORD(minorVer,majorVer);
                if(WSAStartup(sockVersion,&wsaData)!=0){
                        exit(0);
                }
        }
        ~CInitSock(){
                        WSACleanup();
        }
};




---------------------------------------------------------------------------------------------------------------------
以下创建两个项目UDPServer.cpp和UDPClient.cpp



//UDPServer.cpp
#include "stdafx.h"
#include"initsock.h"
#include<stdio.h>

CInitSock initsock;//初始化winsock2库

int _tmain(int argc, _TCHAR* argv[])
{
        //创建套接字
        SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if(s==INVALID_SOCKET){
                printf("Failed socket\n");
                return 0;
        }

        //填充IP地址
        sockaddr_in sin;
        sin.sin_family=AF_INET;
        sin.sin_port=htons(4567);
        sin.sin_addr.S_un.S_addr=INADDR_ANY;

        //绑定套接字到本地地址
        if(bind(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR){
                printf("Failed bind()\n");
                return 0;
        }

        //接收数据
        char buff[1024];
        sockaddr_in addr;
        int nLen=sizeof(addr);
        while(TRUE){
                int nRecv=recvfrom(s,buff,1024,0,(sockaddr *)&addr,&nLen);
                if(nRecv>0){
                        buff[nRecv]='\0';
                        printf("接收到数据(%s):%s",inet_ntoa(addr.sin_addr),buff);
                }
        }
        closesocket(s);
        return 0;
}




//UDPClient.cpp
#include "stdafx.h"
#include"initsock.h"
#include<stdio.h>

CInitSock initsock;//初始化winsock2库


int _tmain(int argc, _TCHAR* argv[])
{
                //创建套接字
        SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if(s==INVALID_SOCKET){
                printf("Failed socket()\n");
                return 0;
        }

        //填充远程地址
        sockaddr_in addr;
        addr.sin_family=AF_INET;
        addr.sin_port=htons(4567);
        addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

                //发送数据
        char szText[]="TCP server demo!\n";
        sendto(s,szText,strlen(szText),0,(sockaddr *)&addr,sizeof(addr));

        return 0;
}




问题
1  SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); ——  SOKCET是套接字?socket()返回套接字句柄?套接字和套接字句柄是一回事吗?
2  addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");——127.0.0.1回环地址到底该如何理解?
3  int nRecv=recvfrom(s,buff,1024,0,(sockaddr *)&addr,&nLen);——recvfrom()与recv()区别?分别用在什么地方?

4 运行时, 一会儿出现 Failed bind(),一会儿什么结果都没有,为什么?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2011-06-14 18:03 |显示全部楼层
在网上找篇介绍socket的文章看一看吧。

论坛徽章:
0
发表于 2011-06-14 20:23 |显示全部楼层
recvfrom()通常用于udp连接中。recv()通常用于Tcp。。
回环地址不属于任何一个有类别地址类。它代表设备的本地虚拟接口。
bind错误,可能是没通过setsocketopt设置地址的重用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP