Windows socket 代码例子

十分简单的客户端

//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的转换。写在这里留个记念。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Win32 Socket代码示例,用于在Windows上设置网卡以接受组播消息: ```c++ #include <WinSock2.h> #include <WS2tcpip.h> #include <iostream> #pragma comment(lib, "Ws2_32.lib") int main() { // 初始化 Winsock WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { std::cerr << "WSAStartup failed: " << iResult << std::endl; return 1; } // 创建套接字 SOCKET socketFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (socketFd == INVALID_SOCKET) { std::cerr << "socket creation failed: " << WSAGetLastError() << std::endl; WSACleanup(); return 1; } // 允许多个套接字绑定到同一地址 BOOL bOptVal = TRUE; iResult = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptVal, sizeof(BOOL)); if (iResult == SOCKET_ERROR) { std::cerr << "setsockopt SO_REUSEADDR failed: " << WSAGetLastError() << std::endl; closesocket(socketFd); WSACleanup(); return 1; } // 绑定套接字到本地地址 sockaddr_in localAddr; localAddr.sin_family = AF_INET; localAddr.sin_port = htons(12345); // 绑定到本地端口12345 localAddr.sin_addr.s_addr = INADDR_ANY; iResult = bind(socketFd, (sockaddr*)&localAddr, sizeof(localAddr)); if (iResult == SOCKET_ERROR) { std::cerr << "bind failed: " << WSAGetLastError() << std::endl; closesocket(socketFd); WSACleanup(); return 1; } // 加入多播组 ip_mreq mreq; inet_pton(AF_INET, "239.255.255.250", &mreq.imr_multiaddr.s_addr); // 组播组地址 mreq.imr_interface.s_addr = INADDR_ANY; // 本地接口地址 iResult = setsockopt(socketFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(ip_mreq)); if (iResult == SOCKET_ERROR) { std::cerr << "setsockopt IP_ADD_MEMBERSHIP failed: " << WSAGetLastError() << std::endl; closesocket(socketFd); WSACleanup(); return 1; } // 接收数据 char buf[1024]; sockaddr_in remoteAddr; int addrLen = sizeof(remoteAddr); iResult = recvfrom(socketFd, buf, sizeof(buf), 0, (sockaddr*)&remoteAddr, &addrLen); if (iResult == SOCKET_ERROR) { std::cerr << "recvfrom failed: " << WSAGetLastError() << std::endl; closesocket(socketFd); WSACleanup(); return 1; } // 处理接收到的数据 std::cout << "Received " << iResult << " bytes from " << inet_ntoa(remoteAddr.sin_addr) << std::endl; std::cout << "Data: " << buf << std::endl; // 关闭套接字 closesocket(socketFd); WSACleanup(); return 0; } ``` 在上面的示例中,我们创建了一个UDP套接字并将其绑定到本地地址和端口。然后,我们使用`setsockopt`函数将其加入到组播组中。最后,我们使用`recvfrom`函数接收来自组播组的数据包。注意,你需要将组播地址和本地接口地址替换为你需要的地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值