socket简单编程(C语言实现)

socket简单编程(C语言实现)

客户端实现

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

//缓冲区溢出会怎么样???

int main()
{
    char Sendbuf[100];		  		//缓冲区
    char Receivebuf[100];
    int SendLen;
    int ReceiveLen;
    SOCKET socket_send;    			//套接字
    SOCKADDR_IN Server_add;			//服务器地址信息结构
    WORD wVersionRequested;			//字
    WSADATA wsaData; 				//库版本 信息结构
    int error;						//表示错误

    wVersionRequested=MAKEWORD(2,2);
    error=WSAStartup(wVersionRequested,&wsaData); //初始化ws2_32.dll动态链接库

    if (error!=0){
        printf("加载套接字失败");
        return 0;
    }
    //判断请求加载的版本号的是否符合要求
    if (LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
        WSACleanup();               //不符合,关闭套接字库
        return 0;
        }

//  设置服务器地址
    Server_add.sin_family=AF_INET;
    Server_add.sin_addr.S_un.S_addr=inet_addr("10.162.183.112");
    Server_add.sin_port=htons(5000);

//创建套接字,但不需要进行bind系统自动进行

    socket_send=socket(AF_INET,SOCK_STREAM,0);

//连接服务器

    if(connect(socket_send,(SOCKADDR*)&Server_add,sizeof(SOCKADDR))==SOCKET_ERROR){
        printf("连接失败\n");
    }

//进行聊天

    while(1){
        printf("please enter message:");
        scanf("%s",Sendbuf);
        //发送数据send(sd,*buf,len,flags);
        SendLen=send(socket_send,Sendbuf,100,0);
        if(SendLen<0){
            printf("发送失败");
        }

        ReceiveLen=recv(socket_send,Receivebuf,100,0);

        if(ReceiveLen<0){
            printf("接受失败\n");
            printf("程序退出\n");
            break;
        }
        else{
            printf("Server say:%s\n",Receivebuf);
        }
    }

    closesocket(socket_send);
    WSACleanup();
    return 0;
}

服务器实现

#include <stdio.h>
#include <winsock.h>

int main()
{
    char Sendbuf[100];
    char Receivebuf[100];
    int SendLen;
    int ReceiveLen;
    int Length;

    SOCKET socket_server;
    SOCKET socket_receive;

    SOCKADDR_IN Server_add;
    SOCKADDR_IN Client_add;

    WORD wVersionRequested;
    WSADATA wsaData;
    int error;

    wVersionRequested=MAKEWORD(2,2);

//两个参数:
//第一个参数指明程序请求使用的WinSock版本,其中高位字节指明副版本、低位字节指明主版本.
//•十六进制整数,例如0x102表示2.1版
//第二个参数返回实际的WinSock的版本信息
//•指向WSADATA结构的指针
    error=WSAStartup(wVersionRequested,&wsaData);


    if(error!=0){
        printf("加载套接字失败\n");
        return 0;
    }
    if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
        WSACleanup();
        return 0;
    }

    Server_add.sin_family=AF_INET;
    Server_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    Server_add.sin_port=htons(5000);

    socket_server=socket(AF_INET,SOCK_STREAM,0);

    if(bind(socket_server,(SOCKADDR*)&Server_add,sizeof(SOCKADDR))==SOCKET_ERROR){
        printf("绑定失败\n");
    }
    printf("开始监听");

    if(listen(socket_server,5)<0){
        printf("监听失败\n");
    }


    Length=sizeof(SOCKADDR);

    //服务程序调用accept函数从处于监听状态的流套接字sd的客户连接请求队列
    //中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道
    socket_receive=accept(socket_server,(SOCKADDR*)&Client_add,&Length);
    if(socket_receive==SOCKET_ERROR){
        printf("接受连接失败\n");
    }

    while(1)
    {
        printf("hello");
        ReceiveLen=recv(socket_receive,Receivebuf,100,0);
        if(ReceiveLen<0){
            printf("接受失败\n");
            printf("程序退出\n");
            break;
        }
        else{
        printf("client say:%s\n",Receivebuf);
        }

        printf("please enter message:\n");
        scanf("%s",Sendbuf);
        SendLen=send(socket_receive,Sendbuf,100,0);
        if(SendLen<0){
            printf("发送失败\n");
        }
    }
        closesocket(socket_receive);
        closesocket(socket_server);
        WSACleanup();
        return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7uTcxmBp-1576686610720)(./images/1576661974880.png)]

猜你喜欢

转载自blog.csdn.net/qq_19332219/article/details/103607111