C++ socket

突然发现博客写的太少了,就把好久之前玩的东西拿来凑个数awa

客户端

#include<WINSOCK2.H>
#include<STDIO.H>
#include<iostream>
#include<cstring>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
bool off;
void Recv(PVOID pt){
    SOCKET sServer=*(SOCKET*)pt;
    char buf[256];
    int len;
    while((len=recv(sServer,buf,256,0))>0){
        buf[len]=0x00;
        printf("Receive:%s\n",buf);
    }
    closesocket(sServer);
    off=true;
}
void Send(PVOID pt){
    SOCKET sServer=*(SOCKET*)pt;
    char buf[256];
    while(1){
        scanf("%s",buf);
        send(sServer,buf,strlen(buf),0);
    }
}
int main(){
    WORD sockVersion=MAKEWORD(2,2);
    WSADATA data;
    if(WSAStartup(sockVersion,&data)!=0)return 0;
    SOCKET sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    sockaddr_in serAddr;
    serAddr.sin_family=AF_INET;
    serAddr.sin_port=htons(8888);
    serAddr.sin_addr.S_un.S_addr=inet_addr("192.168.2.18");
    puts("connecting");
    while(connect(sServer,(sockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR);
    puts("connected");
    _beginthread(Send,0,&sServer);
    _beginthread(Recv,0,&sServer);
    while(!off);
    WSACleanup();
    return 0;
}

服务端

#include<bits/stdc++.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
set<SOCKET>lst;
int ClientSum;
void Recv(PVOID pt){
    SOCKET sClient=*(SOCKET*)pt;
    lst.insert(sClient);
    printf("A new online user,the number of users online:%d\n",++ClientSum);
    char buf[256];
    int len;
    while((len=recv(sClient,buf,256,0))>0){
        buf[len]='\0';
        printf("Receive:%s\n",buf);
    }
    printf("One user goes offline,the number of users online:%d\n",--ClientSum);
    lst.erase(sClient);
    closesocket(sClient);
}
void Send(PVOID pt){
    char buf[256];
    while(1){
        scanf("%s",buf);
        for(set<SOCKET>::iterator i=lst.begin();i!=lst.end();i++)
            send(*i,buf,strlen(buf),0);
    }
}
int main(int argc,char* argv[]){
    WORD sockVersion=MAKEWORD(2,2);
    WSADATA wsaData; 
    if(WSAStartup(sockVersion,&wsaData)!=0)return 0;
    SOCKET slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(slisten==INVALID_SOCKET){
        printf("socket error!");
        return 0;
    }
    sockaddr_in sin;
    sin.sin_family=AF_INET;
    sin.sin_port=htons(8888);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;
    if(bind(slisten,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)printf("bind error!");
    if(listen(slisten,5)==SOCKET_ERROR)return printf("listen error!"),0;
    puts("server start success...");
    SOCKET sClient;
    sockaddr_in remoteAddr;
    int nAddrlen=sizeof(remoteAddr);
    char revData[255];
    _beginthread(Send,0,NULL);
    while(true){
        sClient=accept(slisten,(SOCKADDR*)&remoteAddr,&nAddrlen);
        if(sClient==INVALID_SOCKET){
            printf("accept error!");
            break;
        }
        _beginthread(Recv,0,&sClient);
    }
    closesocket(slisten);
    WSACleanup();
    return 0;
} 

转载于:https://www.cnblogs.com/nlKOG/p/10754361.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值