zoukankan      html  css  js  c++  java
  • C语言Socket编程(计算机网络作业)

    最近我计算机网络课程要做作业了,没办法跟着老师一步一步的写C语言的代码,使用的计算就是Socket通信发送消息;代码实现的功能很简单,客户端向服务器端发送消息,服务器端接收客户端发来的消息,并且输出显示到屏幕上;代码中的每个socket方法的返回值都应该做判断出错情况,例如:创建SOCKET的创建的时候s句柄(或对象),需要判断返回值是否为INVALID_SOCKET,以及socket的所有操作的返回值是否为SOCKET_ERROR,以保证程序的稳定性,这里只是测试代码。

    老师是录制的视频讲解的,其他其中使用的到的方法要求我们自己去查相关的MSDN资料库,如果有不懂的,就自己上网查。

    服务器端接收代码:

    #include <Winsock2.h>
    #pragma comment(lib,"Ws2_32.lib")
    #include <stdio.h>
    #include <memory.h>

    void main()
    {
    WSAData wsd;
    WSAStartup(MAKEWORD(2,0),&wsd);

    SOCKET s =NULL;
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct sockaddr_in ch;
    memset(&ch,0,sizeof(ch));
    ch.sin_family=AF_INET;
    ch.sin_addr.s_addr=INADDR_ANY;
    ch.sin_port=htons(1041);
    int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
    #define QUEUE_SIZE 5
    int l=listen(s,QUEUE_SIZE);
    printf("正在监听本机的1041端口! ");
    SOCKET sc=accept(s,0,0);
    printf("客户端已经连接到本机的1041端口! ");
    #define BUF_SIZE 4096
    int receByt=0;
    while(1)
    {
    char buf[BUF_SIZE];
    receByt=recv(sc,buf,BUF_SIZE,0);
    buf[receByt]='';
    if(receByt>0)
    {
    printf("接收的消息是:%s ",buf);
    }
    else
    {
    printf("接收消息结束!");
    break;
    }

    }
    int ic=closesocket(sc);
    int is=closesocket(s);

    }

    ======================================================
    客户端发送的代码:

    #include <Winsock2.h>
    #pragma comment(lib,"Ws2_32.lib")
    #include <stdio.h>
    #include <memory.h>
    #include <string.h>

    void main()
    {
    WSAData wsd;
    WSAStartup(MAKEWORD(2,0),&wsd);

    SOCKET s =NULL;
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct sockaddr_in ch;
    memset(&ch,0,sizeof(ch));
    ch.sin_family=AF_INET;
    ch.sin_addr.s_addr=inet_addr("127.0.0.1");
    ch.sin_port=htons(1041);

    int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
    printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了! ");
    #define BUF_SIZE 4096
    char info[1024],buf[BUF_SIZE];

    while(1)
    {
    gets(info);
    if(info[0]=='')
    break;
    strcpy(buf,info);
    int nsend=send(s,buf,strlen(buf),0);

    }
    int ic=closesocket(s);
    }

    ========================================================================

    程序代码经过了优化,并且整合多线程,把接收和发送放到同一个文件中,使用参数模式调用发送和接收模块。增加了创建SOCKET的创建的时候s句柄(或对象)判断返回值是否为INVALID_SOCKET,以及socket的bind操作的返回值是否为SOCKET_ERROR,其他socket的操作应该也判断SOCKET_ERROR,以保证程序的稳定性,这里只是测试代码就不去写这么多了,剩下的就由你个人发挥。

    #include <Winsock2.h>
    #pragma comment(lib,"Ws2_32.lib")
    #include <stdio.h>
    #include <memory.h>
    #include <string.h>
    #include <pthread.h>
    
    
    void Receive();
    void Send();
    void creatThread();
    
    SOCKET s =NULL;
    pthread_t t[1000];
    int threadCount=0;
    
    void main(int argc,char* argv[])
    {
        printf("本程序制作人学号:713901040041
    ");
        printf("程序说明:服务器端和客户端为同一个程序,请使用不同的参数运行.
    ");
        printf("接收程序请使用 r参数;发送程序请使用 s参数。
    ");
        //printf("len : %d
    ", argc);
        //printf("count %d
    ",argc);
        //printf("value: %s
    ",argv[1]);
        //printf("%d",argv[1][0]=='r');
    
        if(argc<=1)
        {
            printf("please input program arguments ...
    ");
            exit(0);
        }
        if(argc>1 && argv[1][0]=='r')
        {
            printf("run receive ...
    ");
            Receive();
        }
        if(argc>1 && argv[1][0]=='s')
        {
            printf("run send ...
    ");
            Send();
        }
    }
    
    
    void* receiveWork(void * args)
    {
        SOCKET sc=accept(s,0,0);
        if(sc==INVALID_SOCKET)
        {
            printf("sc Error");
        }
        creatThread();
    
        printf("----------客户端已经连接到本机的%d线程连接!
    ",threadCount-2);
    #define BUF_SIZE 4096
        int receByt=0;
        while(1)
        {
            char buf[BUF_SIZE];
            receByt=recv(sc,buf,BUF_SIZE,0);
            buf[receByt]='';
            if(receByt>0)
            {
                printf("线程接收的消息是:%s
    ",buf);
            }
            else
            {
                printf("客户端已退出,");
                break;
            }
                
        }
        int ic=closesocket(sc);
        printf("服务器结束连接!
    ");
        return NULL;
    }
    
    void creatThread()
    {
        pthread_create(&t[threadCount++],NULL,receiveWork,NULL);
    }
    
    
    void Receive()
    {
        WSAData wsd;
        WSAStartup(MAKEWORD(2,0),&wsd);    
        s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(s==INVALID_SOCKET)
        {
            printf("socket created Error");
        }
        struct sockaddr_in ch;
        memset(&ch,0,sizeof(ch));
        ch.sin_family=AF_INET;
        ch.sin_addr.s_addr=INADDR_ANY;
        ch.sin_port=htons(1041);
        int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
        if(b==SOCKET_ERROR)
        {
            printf("bind 失败,出错代码是:%d
    ",WSAGetLastError());
            exit(0);
        }
    #define QUEUE_SIZE 5
        int l=listen(s,QUEUE_SIZE);
        printf("正在监听本机的1041端口!
    ");
        
        creatThread();
    
        for(int i=0;i<1000;i++)
        {
            pthread_join(t[i],NULL);
        }
    
    int is=closesocket(s);
    }
    
    
    
    void Send()
    {
        WSAData wsd;
        WSAStartup(MAKEWORD(2,0),&wsd);
    
        SOCKET s =NULL;
        s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(s==INVALID_SOCKET)
        {
            printf("socket created Error");
        }
        struct sockaddr_in ch;
        memset(&ch,0,sizeof(ch));
        ch.sin_family=AF_INET;
        ch.sin_addr.s_addr=inet_addr("127.0.0.1");
        ch.sin_port=htons(1041);
    
        int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
        printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!
    ");
    #define BUF_SIZE 4096
        char info[1024],buf[BUF_SIZE];
    
        while(1)
        {
            gets(info);
            if(info[0]=='')
                break;
            strcpy(buf,info);
            int nsend=send(s,buf,strlen(buf),0);
        }
        int ic=closesocket(s);
    }
  • 相关阅读:
    Python环境搭建和开发工具的配置
    教材,教材,国内的教材你为何如此不堪入目?码农,码农,你到底该如何脱离码农?
    从一个新手容易混淆的例子简单分析C语言中函数调用过程
    E3: PS4/PC 莎木3 众筹200万美元 9小时内达成
    [原] blade中C++ singleton的实现
    [百度空间] [转] 四元数(Quaternions)
    [百度空间] [原]DLL导出实例化的模板类
    [百度空间] [转]DLL地狱及其解决方案
    [百度空间] [转+原]虚析构函数
    [百度空间] [转]程序员趣味读物:谈谈Unicode编码
  • 原文地址:https://www.cnblogs.com/mq0036/p/3710507.html
Copyright © 2011-2022 走看看