栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言Socket编程基础二------进程通信

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言Socket编程基础二------进程通信

一、服务端
#include 
#include 
#include 
#include 
#pragma comment (lib, "ws2_32.lib")

#define Max_client 8   ///The number of max clients connected.
#define Max_idlength 10 ///The biggest length of user id
void communication(LPVOID n);
void add_s_n_s(char *s1,int id,char *s2);
void Login(LPVOID n);

SOCKET clientSocket[Max_client];
int login_voucher[Max_client];
char User_id[Max_client][Max_idlength];
int k = 1;


char *account_file = "D:/code/C/socket/basin/file_transmission/account.txt";

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORd(2, 2), &wsaData) != 0;
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("The version of WSADATA is wrong!n");
        return -1;
    }
    printf("The version of WSADATA is available!n");
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET)
    {
        printf("Create the Socket unsuccessfully!n");
        return -1;
    }
    printf("Create the Socket successfully!n");

    SOCKADDR_IN addr = { 0 };

    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10086);
    int r = bind(serverSocket, (SOCKADDR*)&addr, sizeof(addr));
    if (r == -1)
    {
        printf("Fail to bind!n" );
        return -1;
    }
    printf("Binded!n" );

    r = listen(serverSocket, 10);
    if (r == -1)
    {
        printf("Fail to listen!n" );
        return -1;
    }
    printf("Listened!n" );
    SOCKADDR_IN cAddr = { 0 };
    int len = sizeof(cAddr);
    int i = 0;
    while (i < Max_client)
    {
        clientSocket[i++] = accept(serverSocket, (SOCKADDR*)&cAddr, &len);
        k++;
        if (clientSocket[i - 1] == SOCKET_ERROR)
        {
            printf("The client is not available!n");
            closesocket(serverSocket);
            WSACleanup();
            return -1;
        }
        printf("The client %s has connected with server!n",inet_ntoa(cAddr.sin_addr));
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)communication, (LPVOID)i, NULL, NULL);
    }


    return 0;
}

void communication(LPVOID n)
{
    Login(n);
    char buff[256];
    int r;
    int i = (int)n;
    if(login_voucher[i-1]==1)
    {
        return ;
    }
    memset(buff,0,256);
    strcpy(buff,User_id[i-1]);
    send(clientSocket[i-1],buff,strlen(buff),NULL);
    while (1)
    {
        memset(buff, 0, 256);
        r = recv(clientSocket[i - 1], buff, 255, NULL);
        if (r > 0)
        {
            printf("%sn",buff);
            for (int j = 0; j < k; j++)
            {
                if(j!=i-1)
                    send(clientSocket[j], buff, strlen(buff), NULL);
            }
        }

    }
}

void Login(LPVOID n)
{
    char buff[256];
    FILE *fp;
    int read_fp=0;
    int i= (int)n;
    char user_id[10],user_pwd[10],user_name[10];
    fp = fopen(account_file,"rb");
    if(fp==NULL)
    {
        printf("The file %s does not exit!",account_file);
        fclose(fp);
        return;
    }
    recv(clientSocket[i-1],buff,255,0);
    printf("The client want to login the account whose ID is %sn",buff);
    while(1)
    {
        read_fp=fscanf(fp,"%s %s %s",user_id,user_pwd,user_name);
        if(read_fp==-1)
        {
            memset(buff,0,256);
            sprintf(buff,"N");
            send(clientSocket[i-1],buff,strlen(buff),0);
            memset(buff,0,256);
            sprintf(buff,"Can't find the account!");
            send(clientSocket[i-1],buff,strlen(buff),0);
            fclose(fp);
            return 0;
        }
        if(strcmp(user_id,buff)==0)
        {
            memset(buff,0,256);
            sprintf(buff,"Y");
            send(clientSocket[i-1],buff,strlen(buff),0);
            memset(buff,0,256);
            sprintf(buff,"Please input the password of the account!");
            send(clientSocket[i-1],buff,strlen(buff),0);
            fclose(fp);
            break;
        }
    }
    int pwd_time =1;
    while(pwd_time<4)
    {
        memset(buff,0,256);
        recv(clientSocket[i-1],buff,255,0);
        printf("%sn",buff);
        if (strcmp(buff,user_pwd)==0)
        {
            memset(buff,0,256);
            sprintf(buff,"Y");
            send(clientSocket[i-1],buff,strlen(buff),0);
            memset(buff,0,256);
            sprintf(buff,"Login the account successfully!");
            send(clientSocket[i-1],buff,strlen(buff),0);
            printf("One account has login,ID:%s PWD:%s NAME:%sn",user_id,user_pwd,user_name);
            memset(buff,0,256);
            strcpy(buff,user_name);
            send(clientSocket[i-1],buff,strlen(buff),0);
            break;
        }
        memset(buff,0,256);
        sprintf(buff,"N");
        send(clientSocket[i-1],buff,strlen(buff),0);
        pwd_time += 1;
        memset(buff,0,256);
        sprintf(buff,"Please input the password again!");
        send(clientSocket[i-1],buff,strlen(buff),0);
    }
    if(pwd_time<4)
    {
        return 1;
    }
    sprintf(buff,"Login the account unsuccessfully!");
    send(clientSocket[i-1],buff,strlen(buff),0);
    return 0;
}

二、客户端
#include 
#include 
#include 
#include 
#pragma comment (lib, "ws2_32.lib")


SOCKET serverSocket;
void scan(char s[],int len);
int Login();

char user_name[10];
void recvAndShow()
{
    int r, i = 0;
    char buff[256];
    while (1)
    {
        memset(buff, 0, 256);
        r = recv(serverSocket, buff, 255, NULL);
        if(r>0)
            printf("%sn",buff);
    }
}

int main()
{
    WSADATA wsaData;

    char buff[256];
    char buff1[256];
    WSAStartup(MAKEWORd(2, 2), &wsaData) != 0;
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("The version of WSADATA is wrong!n");
        return -1;
    }
    printf("The version of WSADATA is available!n");
    serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET)
    {
        printf("Create the Socket unsuccessfully!n");
        return -1;
    }
    printf("Create the Socket successfully!n");
    SOCKADDR_IN addr = { 0 };
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10086);
    int r = connect(serverSocket, (SOCKADDR*)&addr, sizeof(addr));
    if (r == -1)
    {
        printf("It is successful to connect with the Server!n");
        return -1;
    }
    printf("It is unsuccessful to connect with the Server!n");
    while(!Login())
        continue;
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)recvAndShow, NULL, NULL, NULL);
    fflush(stdin);
    while (1)
    {
        memset(buff, 0, 256);
        memset(buff1,0,256);
        printf("User %s:",user_name);
        scan(buff,256);
        sprintf(buff1,"User %s:%s",user_name,buff);
        r = send(serverSocket, buff1, strlen(buff1), NULL);
    }
    return 0;
}

int Login()
{
    char buff[256];
    int i=1;
    printf("Login ID:");
    memset(buff,0,256);
    scanf("%s",buff);
    send(serverSocket,buff,strlen(buff),0);
    memset(buff,0,256);
    recv(serverSocket,buff,255,0);
    if(buff[0]=='N')
    {
        memset(buff,0,256);
        recv(serverSocket,buff,255,0);
        printf("%s",buff);
        return 0;
    }
    memset(buff,0,256);
    recv(serverSocket,buff,255,0);
    printf("%sn",buff);
    while(i<4)
    {
        printf("Login PWD:");
        memset(buff,0,256);
        scanf("%s",buff);
        send(serverSocket,buff,strlen(buff),0);
        recv(serverSocket,buff,255,0);
        if(buff[0]=='Y')
        {
            memset(buff,0,256);
            recv(serverSocket,buff,255,0);
            printf("%sn",buff);
            memset(buff,0,256);
            recv(serverSocket,buff,255,0);
            strcpy(user_name,buff);
            return 1;
        }
        memset(buff,0,256);

        recv(serverSocket,buff,255,0);
        printf("%sn",buff);
    }
    memset(buff,0,256);
    recv(serverSocket,buff,255,0);
    printf("%sn",buff);
    return 0;
}
void scan(char *s,int len)
{
    char c;
    int i=0;
    while(i
        c = getchar();
        if(c =='n')
            return ;
        s[i++] = c;
    }
    printf("The input is bigger than the length of char arrayn");
    return ;
}
三、使用方法 1、需要替换掉服务端的account_file文件路径,txt内容格式为一行包括:账号名 密码 用户名,例如1 1234 hans。 四、参考博客

C++基于socket编程实现聊天室功能

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号