Windows socket 代码例子

本文介绍了一个使用Winsock实现的简单客户端与服务端通信的示例代码。客户端连接到本地服务端口50000并接收数据;服务端监听该端口,并向客户端发送其IP地址。
十分简单的客户端

//coffeexp
#include "stdafx.h"
#include <winsock2.h>
using namespace std;

UINT startClient(LPVOID );
int _tmain()
{
    AfxBeginThread(startClient,0);
    getchar();
    return 0;
}

UINT startClient(LPVOID pParam)
{
    cout<<"client started!"<<endl;
    SOCKET fd;
    WSADATA wsaData;
    sockaddr_in server_addr;
    char recvbuff[1024];
    memset(recvbuff,0,1024);

    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret!=0)
        return 0;
    server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons((u_short)50000);

    fd=socket(AF_INET,SOCK_STREAM,0);
    if(fd==INVALID_SOCKET)
        cout<<"socket create error"<<endl;
    if(connect(fd,(sockaddr*)&server_addr,sizeof(server_addr)))
    {
        cout<<"connect error"<<endl;
        closesocket(fd);
        return 0;
    }
    if(recv(fd,recvbuff,sizeof(recvbuff),0))
    {
    CString aa(recvbuff);
    wcout<<"Data is:  "<<aa<<endl;
    }
    closesocket(fd);
    WSACleanup();

    return 0;
}

服务端程序:
#include "stdafx.h"
#include <winsock2.h>
using namespace std;

UINT ServerThread(LPVOID );

int _tmain()
{
    AfxBeginThread(ServerThread,0);
    getchar();
    return 0;
}
UINT ServerThread(LPVOID pParam)
{
    cout<<"Starting TCP server...."<<endl;
    SOCKET server;
    WSADATA wsaData;
    sockaddr_in local;
    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret!=0)
        return 0;
    local.sin_family=AF_INET;
    local.sin_addr.s_addr=INADDR_ANY;
    local.sin_port=htons(50000);
    server=socket(AF_INET,SOCK_STREAM,0);
    if(server==INVALID_SOCKET)
        return 0;
    if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
        return 0;
    if(listen(server,2)!=0)
        return 0;
    SOCKET client;   
    sockaddr_in from;
    int length=sizeof(from);
    while(true)
    {
        CString s(L"you ip is :");
        client =accept(server,(sockaddr*)&from,&length);
        s+=inet_ntoa(from.sin_addr);
        wcout<<(LPCTSTR)s<<endl;
        send(client,(char*)(LPCTSTR)s,s.GetLength(),0);
        cout<<"message had send to "<<inet_ntoa(from.sin_addr)<<endl;
        closesocket(client);
    }
    closesocket(server);
    WSACleanup();

    return 0;
}


这里面有个有趣的问题,将S正确发到client,但client打印时只能显示第一个即"y",这就是著名的unicode ascii的转换。写在这里留个记念。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值