windows Socket + tcp 简单实例

/* Windows Socket +tcp 服务器端
* 创建socket:
*SOCKET socket (int af, int type, int protocol);
*第一个参数af: 表示族地址,网络编程一般使用AF_INET宏。
*第二个参数type: 表示连接类型,TCP选面向连接SOCK_STREAM,UDP选数据报SOCK_DGRAM。
*第三个参数protocol: 表示协议,使用AF_INET族地址TCP连接时,设为IPPROTO_TCP。
*
*监听socket:
*int listen(SOCKET s, int nQueueSize);
*第一个参数: 监听的socket。
*第二个参数: 套接字监听队列最大连接请求数。
*该函数将监听对socket的连接请求。
*
*请求连接:
*int connect(SOCKET s,const struct sockaddr *saddr,int namelen) ;
*第一个参数: socket本地进程的socket。
*第二个参数: 对应AF_INET,对方IP,端口等socket地址标识sockaddr_in。
*第三个参数: 对应AF_INET,使用sockaddr_in结构大小。
*
*
*接受连接请求:
*SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrlen);
*第一个参数: socket为被监听的socket。
*第二个参数: 对应AF_INET,一个sockaddr指针,将写入发送请求方的sockaddr_in信息。
*第三个参数: 对应AF_INET,sockaddr_in结构体的大小。
*该函数用于接受一个socket连接请求,返回一个新的连接socket(实质是请求方的socket),发送与接收数据通过这个连接套socket。
*
*发送数据:
*int send(SOCKET s, const char *buf, int len, int flags );
*第一个参数: socket为对方的socket。
*第二个参数: 发送数据的缓冲区。
*第三个参数: 数据缓冲区大小。
*第四个参数: 紧急状态,一般这为0。
*该函数用于向对方socket发送数据,成功返回发送数据的大小数。
*
*发送数据:
*int recv(SOCKET s, char *buf, int len, int flags);
*第一个参数: socket为对方的socket。
*第二个参数: 接收数据的缓冲区。
*第三个参数: 缓冲区大小。
*第四个参数: 紧急状态,一般这为0。
*该函数用于接收对方发送的数据,成功返回发送数据的大小数。
*
*关闭套接字:
*int closesocket(SOCKET s);
*参数为socket。
*该函数用于关闭套接字。
*/

//服务器端

#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
    SOCKET serversoc;
    SOCKET clientsoc;
    SOCKADDR_IN serveraddr;
    SOCKADDR_IN clientaddr;
    char buf[1024];
    int len;

    WSADATA wsa;
    WSAStartup(MAKEWORD(2,0),&wsa);

    if((serversoc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) <= 0)
    {
        printf("套接字socket创建失败!\n");
        return -1;
    }

    serveraddr.sin_family   = AF_INET;
    serveraddr.sin_port     = htons(9102);
    serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

    if (bind(serversoc,(SOCKADDR*)&serveraddr,sizeof(serveraddr)) != 0)
    {
        printf("套接字绑定失败!\n");
        return -1;
    }

    printf("开始监听\n");

    if (listen(serversoc,1) != 0)
    {
        printf("监听失败!\n");
        return -1;
    }
    len = sizeof(SOCKADDR_IN);

    if ((clientsoc = accept(serversoc,(SOCKADDR *)&clientaddr,&len)) <= 0)
    {
        printf("接受连接失败!\n");
        return -1;
    }
    printf("连接成功\n");

    while(1)
    {
        if (recv(clientsoc,buf,1024,0) <= 0)
        {
            printf("关闭连接\n");
            closesocket(clientsoc);
        }
        printf("接受来自客户端的信息:%s\n",buf);
        break;
    }


    printf("请输入发送给客户端的字符:\n");
    scanf("%s",buf);

    if (send(clientsoc,buf,strlen(buf)+1,0) <= 0)
    {
        printf("发送错误!\n");
    }

    getchar();
    WSACleanup();

    return 0;
}

//客户端

#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
    SOCKET clientsocket;
    SOCKADDR_IN serveraddr;
    SOCKADDR_IN clientaddr;
    char buf[1024];

    WSADATA wsa;
    WSAStartup(MAKEWORD(2,0),&wsa);

    if ((clientsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) <= 0)
    {
        printf("套接字socket创建失败!\n");
        return -1;
    }

    serveraddr.sin_family       = AF_INET;
    serveraddr.sin_port         = htons(9102);
    serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    printf("尝试连接中..\n");
    if (connect(clientsocket,(SOCKADDR*)&serveraddr,sizeof(serveraddr)) != 0)
    {
        printf("连接失败!\n");
        return -1;
    }
    printf("连接成功!\n");

    printf("请输入发送给服务器的字符:\n");
    scanf("%s",buf);
    if (send(clientsocket,buf,strlen(buf)+1,0) <= 0)
    {
        printf("发送错误");
    }

    while(1)
    {
        if (recv(clientsocket,buf,1024,0) <= 0)
        {
            printf("关闭连接!\n");
            closesocket(clientsocket);
        }
        printf("接受来自服务器的信息:%s\n",buf);
        break;
    }


    getchar();
    closesocket(clientsocket);

    WSACleanup();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值