socket client 编程之一:入门

/***************************************************************************************************
                                        socket client 编程
功能:  向客户端发送 i am zhang yong hui 一次
        从客户端接收一次数据,输出数据个数(<10)。
环境:  VC2005 C语言编写

版本:  SCV1.1  (socket client 演示)
编者:  张永辉
时间:  2011年11月14日
参考:
        C语言编程---socket基础.doc
***************************************************************************************************/
#include    "stdafx.h"
#include    <Winsock2.h>                            //socket
#pragma     comment(lib,"ws2_32")
#include    <stdio.h>                               //printf
#define     SERVER_PORT 8080                        //客户端端口
#define     SERVER_IPADDR "169.254.123.236"         //客服端IP

int main(int argc, _TCHAR* argv[])
{
    int err;

    //第一步:加载winsock库
    WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2,2);                           //使用2.2版本
    err = WSAStartup(sockVersion,&wsaData);                     //申请使用SOCKET,返回0表示成功,才可以使用其库函数。
    if(err!=0)                                                  //
    {
        printf("socket error 0 \n");
        return 0;
    }

    //第二步:创建套接字
    //参数解释:AF_INET表示TCP/IP协议族,SOCK_STREAM流套接字类型,IPPROTO_TCP指TCP协议
    SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);   //新创建的套接字的描述符
    if(sClient==INVALID_SOCKET)                                 //INVALID_SOCKET表示创建失败
    {                                                           //
        printf("socket error 1 \n");
        return 0;
    }

    //第三步:绑定的Socket
    struct sockaddr_in saddr;                                   //创建结构
    saddr.sin_family = AF_INET;                                 //AF_INET指定为TCP/IP协议族的套接字
    saddr.sin_port = htons(SERVER_PORT);                        //指明端口号 htons??
    //saddr.sin_addr.s_addr = htonl(INADDR_ANY);                //无论哪个网段的客户都能与其通讯。(与下句互斥)
    saddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IPADDR);      //固定IP,inet_addr()将字符串IP转换成整行IP
    //参数:待绑定的Socket描述符,指定sockaddr结构,namelen
    bind(sClient,(struct sockaddr *)&saddr,sizeof(saddr));      //仅服务端调用此函数。

    //第四步:连接客户端
    //参数:
    err = connect(sClient,(struct sockaddr *)&saddr,sizeof(saddr));//连接成功,connect返回0;失败则返回SOCKET_ERROR
    if(err == SOCKET_ERROR)
    {
        closesocket(sClient);
        WSACleanup();
        printf("socket error 2 \n");
        return 0;
    }

    //第五步:发送数据
    char SendData[]="i am zhang yong hui";
    //参数:套接字,缓冲区,字节数,一般为0
    send(sClient,SendData,strlen(SendData),0);                  //失败返回SOCKET_ERROR,具体看发送流程。

    //第六步:接收数据
    //参数:套接字,缓冲区,字节数,一般为0
    char RecvData[10];
    err = recv(sClient,SendData,10,0);  //在copy时出错返回SOCKET_ERROR,断网返回0,其他时候返回接收到的数据个数。有超时是多少?

    printf("recv num = %d \n",err);     //打印接收到的数目

    //关闭一个描述符为s套接字
    closesocket(sClient);
    //最后一步:解除与Socket库的绑定并且释放Socket库所占用的系统资源
    WSACleanup();

    printf("num = %d\n",sockVersion);
    //------------------------------------------------------
    printf("the end of project\n");
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值