代码改变世界

windows tcp c++

2012-10-06 22:41  kennyMc  阅读(830)  评论(0)    收藏  举报

最基本的tcp同步实现

c头文件里面的东西真是难看,还是c#用着舒服

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

using namespace std;

class CInitSock
{
private:
    WSADATA WsaData;
    //如果是系统无法识别的版本,那么会默认一个系统期待的版本
    WORD WinSockVer;
public:
    CInitSock(BYTE LVer=2,BYTE HVer=2)
    {
        WinSockVer=MAKEWORD(LVer,HVer);
    }
    int LoadWinSock()
    {
        //参考http://msdn.microsoft.com/en-us/library/ms742213(VS.85).aspx
        return    WSAStartup(WinSockVer,&WsaData);
    }
};

CInitSock cisk;
int main()
{
    int _result=cisk.LoadWinSock();
    if(_result!=0)
    {
        cout<<"WSAStartup_ERROR:"<<_result<<endl;
        return 1;
    }
    
    SOCKET listen=socket(
        AF_INET,//地址格式,貌似winsock中是写死AF_INET
        SOCK_STREAM,//流套字节
        IPPROTO_TCP);
    if(listen==INVALID_SOCKET)
    {
        cout<<"socket_ERROR:INVALID_SOCKET"<<endl;
        return 1;
    }

    sockaddr_in sin;
    sin.sin_family=AF_INET;
    sin.sin_port=htons(5678);//转成网络字节顺序
    sin.sin_addr.S_un.S_addr=INADDR_ANY;

    if(bind(listen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
    {
        cout<<"bind_ERROR:SOCKET_ERROR"<<endl;
        return 1;
    }

    //开始监听,未处理连接最大数测试用10
    if(::listen(listen,10)==SOCKET_ERROR)
    {
        cout<<"listen_ERROR:SOCKET_ERROR"<<endl;
        return 1;
    }

    SOCKET client;
    sockaddr_in remoteAddr;
    int len=sizeof(remoteAddr);
    const char message[]="welcome";
    int len_msg=strlen(message);
    while(true)
    {
       client=accept(listen,(SOCKADDR*)&remoteAddr,&len);
       if(client==INVALID_SOCKET)
       {
           cout<<"accept_ERROR:INVALID_SOCKET"<<endl;
           continue;
       }
       cout<<"客户端连接:"<<inet_ntoa(remoteAddr.sin_addr)
           <<":"<<remoteAddr.sin_port<<endl;
       send(client,message,len_msg,0);
       closesocket(client);
    }
    closesocket(listen);
    system("PAUSE");
    return 0;
}

 

CInitSock cisk;
int main()
{
    int _result=cisk.LoadWinSock();
    if(_result!=0)
    {
        cout<<"WSAStartup_ERROR:"<<_result<<endl;
        return 1;
    }
    
    SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(s==INVALID_SOCKET)
    {
        cout<<"socket_ERROR:INVALID_SOCKET"<<endl;
        return 1;
    }

    sockaddr_in serverAddr;
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_port=htons(5678);
    serverAddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.100");

    if(connect(s,(sockaddr*)&serverAddr,sizeof(serverAddr))==-1)
    {
        cout<<"connect_ERROR:-1"<<endl;
        return 1;
    }

    char buff[1024];
    int nRecv=recv(s,buff,1024,0);
    if(nRecv>0)
    {
        buff[nRecv]='\0';
        cout<<"服务端信息:"<<buff<<endl;
    }
    system("PAUSE");
    return 0;
}



本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。