简单的TCP编程

//Sever

#include "stdafx.h"
#include<WinSock2.h>
#include<windows.h>
#include<iostream>
using namespace std;
#pragma comment (lib,"ws2_32.lib")
#define PORT 6000

DWORD WINAPI clientProc(LPVOID lparam)
{
    //为客户端服务
    SOCKET sockClient = (SOCKET)lparam;
    CHAR szbuf[1024];
    while (TRUE)
    {
        memset(szbuf, 0, 1024);
        int ret = recv(sockClient, szbuf, sizeof(szbuf), 0);
        if (ret== SOCKET_ERROR)
        {
            cout << "服务器接受失败" << endl;
            return -1;
        }
        if (ret==0)
        {
            cout << "客户端关闭连接" << endl;
            return -1;
        }
        cout << "Sever:" << szbuf << endl;
        ret = send(sockClient, szbuf, sizeof(szbuf), 0);
        if (ret==SOCKET_ERROR)
        {
            cout << "服务器发送数据失败" << endl;
            return -1;
        }
    }
    closesocket(sockClient);
    return 0;
}
//初始网络环境失败
bool InitNetEnv()
{
    WSADATA wd;
    if (WSAStartup(MAKEWORD(2, 2), &wd) != 0)
    {
        cout << "初始网络环境失败" << endl;
        return false;
    }
    return true;
}
//TCP Sever
int main()
{
    if (!InitNetEnv())
    {
        return -1;
    }
    cout << "初始网络环境成功" << endl;
    //创建套接字
    SOCKET sSever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sSever==INVALID_SOCKET)
    {
        cout << "创建套接字失败" << endl;
        return -1;
    }
    cout << "创建套接字成功" << endl;
    //初始化网络节点
    SOCKADDR_IN addrSever;
    addrSever.sin_family = AF_INET;            //IPV4
    addrSever.sin_port = htons(PORT);        
    addrSever.sin_addr.S_un.S_addr = INADDR_ANY;    //服务器上所有的网卡的IP地址
    //进行绑定
    int ret = bind(sSever, (sockaddr *)&addrSever, sizeof(sockaddr));
    if (ret==SOCKET_ERROR)
    {
        cout << "套接字绑定失败" << endl;
        return -1;
    }
    cout << "套接字绑定成功" << endl;
    ret=listen(sSever, SOMAXCONN);        //进行监听
    if (ret == SOCKET_ERROR)
    {
        cout << "服务器监听失败" << endl;
        return -1;
    }
    cout << "服务器监听成功" << endl;
    //监听成功,接受客户端的连接请求
    SOCKADDR_IN addrClient;
    int addrClinetLen = sizeof(SOCKADDR_IN);
    while (TRUE)
    {
        SOCKET *sClient = new SOCKET;
        //接受连接,accept是阻塞型函数,如果没有客户端连接,会卡在这里
        *sClient=accept(sSever,(sockaddr *)&addrClient,&addrClinetLen);
        if (*sClient==INVALID_SOCKET)
        {
            cout << "接受客户端请求失败" << endl;
            WSACleanup();
            closesocket(sSever);
            return -1;
        }
        cout << "接受客户端请求成功" << endl;
        //为客户端创建线程处理
        CreateThread(NULL, 0, clientProc,(LPVOID)*sClient, NULL, NULL);
        Sleep(10);
    }
    closesocket(sSever);
    WSACleanup();
    return 0;
}


//Client
#include "stdafx.h"
#include<WinSock2.h>
#include<windows.h>
#include<iostream>
using namespace std;
#pragma comment (lib,"ws2_32.lib")
#define PORT 6000
//TCP Client

//初始化网络环境
bool InitNetEnv()
{
    WSADATA wsa;
    if (WSAStartup(MAKEWORD(2, 2), &wsa)!=0)
    {
        cout << "初始化网络环境失败" << endl;
        return false;
    }
    return true;
}

int main()
{
    if (!InitNetEnv())
    {
        return -1;
    }
    //创建一个套接字socket
    SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sClient==INVALID_SOCKET)
    {
        cout << "创建套接字失败" << endl;
        WSACleanup();
        return -1;
    }
    //初始化网络节点
    SOCKADDR_IN si;
    si.sin_family = AF_INET;
    si.sin_port = htons(PORT);
    si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    //连接
    int ret = connect(sClient, (sockaddr *)&si, sizeof(sockaddr));
    if (ret==SOCKET_ERROR)
    {
        cout << "网络连接失败"<<endl;
        WSACleanup();
        closesocket(sClient);
        return -1;
    }
    char szbuf[2048];
    memset(szbuf, 0, sizeof(szbuf));
    sprintf_s(szbuf,2048, "hello my first socket Sever");
    //向服务器发送消息
    ret = send(sClient, szbuf, strlen(szbuf), 0);
    if (ret == SOCKET_ERROR)
    {
        cout << "客户端发送失败" << endl;
        WSACleanup();
        closesocket(sClient);
        return -1;
    }
    //接受从服务器发回来的消息
    ret = recv(sClient, szbuf, sizeof(szbuf), 0);
    if (ret == SOCKET_ERROR)
    {
        cout << "客户端接收失败" << endl;
        WSACleanup();
        closesocket(sClient);
        return -1;
    }
    cout << "client:" << szbuf << endl;
    //关闭套接字,释放网络环境
    closesocket(sClient);
    WSACleanup();
    return 0;
}

 

posted @ 2017-07-04 10:57  菜鸟也有高飞的时候  阅读(225)  评论(0编辑  收藏  举报