C 实现socket 数据互传

因为参加某场测试偶然拿到了这样一个题目

之前完全没有接触过计算机网络问题 写的比较粗糙 发上来做个记录日后进行优化

主体思想如图


根据服务器与客户端的此原理以及 传入传出函数

Ò recv ()/send()
Ò send( int sockfd , const void * buf , size_t len , int flags );
Ò recv ( int sockfd ,void * buf , size_t len , int flags );

代码如下
/****************
 服务器
****************/
#include <stdio.h>
#include <winsock2.h>
#define  SERVER_PORT 1234

int main()
{
    WORD sockversion = MAKEWORD(2,2);
    WSADATA wasdata;
    if(WSAStartup(sockversion,&wasdata)!=0)
    {
        printf("函数库设置失败\n");
        exit(1);
    }

    SOCKET sListen,sServer;
    sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sListen == INVALID_SOCKET)
    {
        printf("socket创建失败\n");
        WSACleanup();
        exit(1);
    }

    struct sockaddr_in saserver,saclient;
    saserver.sin_family = AF_INET;
    saserver.sin_port = htons(SERVER_PORT);
    saserver.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

    if(bind(sListen,(struct sockaddr*)&saserver,sizeof(saserver))==SOCKET_ERROR)
    {
        printf("绑定错误!\n");
        closesocket(sListen);
        WSACleanup();
        exit(1);
    }

    if(listen(sListen,5)==SOCKET_ERROR)
    {
        printf("侦听发生错误!\n");
        closesocket(sListen);
        WSACleanup();
        exit(1);
    }
    printf("jojo:程序已启动等待连接中\n");
    int length;
    char message[500];
    char *ptr;
    int judge;

    while(1)
    {
        length = sizeof(saclient);
        sServer = accept(sListen,(struct sockaddr*)&saclient,&length);
        if(sServer == INVALID_SOCKET)
        {
            printf("连接失败");
            closesocket(sListen);
            WSACleanup();
            exit(1);
        }
        printf("收到连接:%s\n",inet_ntoa(saclient.sin_addr));

        ptr = message;
        left =sizeof(message);
    while(1)
    {
            judge = recv(sServer,ptr,500,0);
//            printf("judge = %d",judge);
            if(judge==SOCKET_ERROR)
            {
                printf("连接出现问题");
                exit(1);
            }
            if(judge==0)
            {
                printf("该客户已下线");
            break;
            }
//            left = left-judge;
//            ptr = ptr+judge;
//            printf("\nleft =%d",left);
            printf("收到消息: %s\n",message);
            message[judge] = 0x00;
//            printf("%c\n",message[judge]);
            if(strcmp(message,"ADD")==0)
            {
                double x,y,z;
                recv(sServer,(char*)&x,sizeof(double),0);
                recv(sServer,(char*)&y,sizeof(double),0);
                z = x+y;
                send(sServer,(char*)&z,sizeof(double),0);
                continue;
            }
            else if(strcmp(message,"DELETE")==0)
            {
                double x,y,z;
                recv(sServer,(char*)&x,sizeof(double),0);
                recv(sServer,(char*)&y,sizeof(double),0);
                z = x-y;
                send(sServer,(char*)&z,sizeof(double),0);
                continue;
            }
            else if(strcmp(message,"MULTIPLY")==0)
            {
                double x,y,z;
                recv(sServer,(char*)&x,sizeof(double),0);
                recv(sServer,(char*)&y,sizeof(double),0);
                z = x*y;
                send(sServer,(char*)&z,sizeof(double),0);
                continue;
            }
            else if(strcmp(message,"DIVIDE")==0)
            {
                double x,y,z;
                recv(sServer,(char*)&x,sizeof(double),0);
                recv(sServer,(char*)&y,sizeof(double),0);
                z = x/y;
                send(sServer,(char*)&z,sizeof(double),0);
                continue;
            }
        char senddata[500];
        printf("please say some thing to him/her?:\n");
        scanf("%s",senddata);
        send(sServer,senddata,500,0);

        }
    }
}

/**********************
server
**********************/
#include <stdio.h>
#include <winsock2.h>
#define  SERVER_PORT 1234

int main()
{
    WORD sockversion = MAKEWORD(2,2);
    WSADATA wasdata;
    if(WSAStartup(sockversion,&wasdata)!=0)
    {
        printf("函数库初始化失败\n");
        exit(1);
    }

    SOCKET sClient;
    sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sClient == INVALID_SOCKET)
    {
        printf("初始化失败\n");
        WSACleanup();
        exit(1);
    }

    struct sockaddr_in saserver;
    saserver.sin_family = AF_INET;
    saserver.sin_port = htons(SERVER_PORT);
    saserver.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    if(connect(sClient,(struct sockaddr*)&saserver,sizeof(saserver))==SOCKET_ERROR)
    {
        printf("conection failed");
        closesocket(sClient);
        WSACleanup();
        exit(1);
    }
    while(1)
    {
        char *senddata;
        char array[500];
        printf("jojo:please enter words that you want to say to jojo\n");
        printf("Hint: if you are going to use online calculating\n");
        printf("Input coomand:ADD as +,DELETE as -,MULTIPLY as *,DIVIDE as /\n");
        printf("Following inputs can be decimal which should be seperated by a space \n");

        scanf("%s",array);
        senddata = array;
        send(sClient,senddata,sizeof(array),0);
            if(strcmp(array,"ADD")==0)
            {
                double x,y,z;
                scanf("%lf%lf",&x,&y);
                send(sClient,(char*)&x,sizeof(double),0);
                send(sClient,(char*)&y,sizeof(double),0);
                recv(sClient,(char*)&z,sizeof(double),0);
                printf("your result is:%lf\n\n",z);
                continue;
            }
            else if(strcmp(array,"DELETE")==0)
            {
                double x,y,z;
                scanf("%lf%lf",&x,&y);
                send(sClient,(char*)&x,sizeof(double),0);
                send(sClient,(char*)&y,sizeof(double),0);
                recv(sClient,(char*)&z,sizeof(double),0);
                printf("your result is:%lf\n\n",z);
                continue;
            }
            else if(strcmp(array,"MULTIPLY")==0)
            {
                double x,y,z;
                scanf("%lf%lf",&x,&y);
                send(sClient,(char*)&x,sizeof(double),0);
                send(sClient,(char*)&y,sizeof(double),0);
                recv(sClient,(char*)&z,sizeof(double),0);
                printf("your result is:%lf\n\n",z);
                continue;
            }
            else if(strcmp(array,"DIVIDE")==0)
            {
                double x,y,z;
                scanf("%lf%lf",&x,&y);
                if(y==0){    printf("error!\n%lf should not divided by 0",x);
                             continue;}
                send(sClient,(char*)&x,sizeof(double),0);
                send(sClient,(char*)&y,sizeof(double),0);
                recv(sClient,(char*)&z,sizeof(double),0);
                printf("your result is:%lf\n\n",z);
                continue;
            }
        printf("your input is %s\n",array);
        int ret;
        char recvdata[500];

        ret = recv(sClient,recvdata,500,0);
        if(ret>0)
        {
            recvdata[ret]= 0x00;
            printf("receive message from jojo :%s\n\n",recvdata);
        }
    }
    return 0;
}

注意一般要加入#pragma comment(lib,"ws2_32.lib")

我使用的codeblock环境在编译器设置里添加了libws2_32.a 和libwsock.a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值