2025-04-30

服務端說明

 

#include <errno.h>                //一些錯誤信息的處理

#include <stdio.h>                 // 標準輸入輸出

#include <sys/types.h>          //基本系統數據類型

#include <netinet/in.h>           //Internet address family 定義像sockaddr_in這個的地址族

#include <sys/socket.h>        //socket 

#include <unistd.h>               //系統定義符號常量的頭文件,包含瞭許多UNIX系統服務的函數原型,例如read函數、write函數

#include <netdb.h>                //netdb.h 定義瞭與網絡有關的結構,變量類型,宏,函數。如:struct hostent  *gethostbyaddr(const void *addr, size_t len, int type);

#include <arpa/inet.h>            // 定義瞭 inet_addr

#include <fcntl.h>                   //fcntl.h定義瞭很多宏和open,fcntl函數原型 close等

#include <stdlib.h>                 //標準庫

#include <string.h>                 //string

int main(int argc, const char * argv[])

{

 

    int sfp,nfp; //套接字描述符

    struct sockaddr_in s_add,c_add; //服務端和客戶端地址

    unsigned int sin_size;

 

    unsigned short portnum=3000; //綁定端口號

    

    printf("Hello,welcome to my server !\r\n");

    sfp = socket(AF_INET, SOCK_STREAM, 0); //套接字描述符

    if(-1 == sfp)//如果失敗

    {

        printf("socket fail ! \r\n");

        return -1;

    }

    printf("socket ok !\r\n");

    

    

    bzero(&s_add,sizeof(struct sockaddr_in));//清0

    s_add.sin_family=AF_INET; 

    s_add.sin_addr.s_addr=htonl(INADDR_ANY);// 任何地址

    s_add.sin_port=htons(portnum);//端口號

    

    if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))) //如果綁定失敗

    {

        printf("bind fail !\r\n");

        return -1;

    }

    printf("bind ok !\r\n");

    

    if(-1 == listen(sfp,5))//如果listen失敗

    {

        printf("listen fail !\r\n");

        return -1;

    }

    printf("listen ok\r\n");

    

    while(1)

    {

        sin_size = sizeof(struct sockaddr_in);

        

        nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);//不斷accept

        //如果accpet成功的話,客戶端的一些信息就在 c_add 中

        if(-1 == nfp)//失敗

        {

            printf("accept fail !\r\n");

            return -1;

        }

        printf("accept ok!\r\nServer start get connect from %#x : %#x\r\n",

               ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));

        // 打印客戶端的地址和端口

        

        if(-1 == write(nfp,"hello,welcome to my server \r\n",32))//寫入數據

        {

            printf("write fail!\r\n");

            return -1;

        }

        printf("write ok!\r\n");

        close(nfp);//關閉

        

    }

    close(sfp);//關閉

    return 0;

}

 

 

 

客戶端說明

 

#include <errno.h>

#include <stdio.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <unistd.h>

#include <netdb.h>

#include <arpa/inet.h>

#include <fcntl.h>

#include <stdlib.h>

#include <string.h>

 

int main()

{

    int cfd;//套接字描述符

    ssize_t recbytes;//接受字節長度

    char buffer[1024]={0};//接收字節緩存區

    struct sockaddr_in s_add;//連接的地址

    unsigned short portnum=3000;//連接端口

    

    printf("Hello,welcome to client !\r\n");

    

    cfd = socket(AF_INET, SOCK_STREAM, 0);

    if(-1 == cfd)

    {

        printf("socket fail ! \r\n");

        return -1;

    }

    printf("socket ok !\r\n");

    

    bzero(&s_add,sizeof(struct sockaddr_in));//清空

    s_add.sin_family=AF_INET;

    s_add.sin_addr.s_addr= inet_addr("192.168.1.101");

    s_add.sin_port=htons(portnum);

    printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);

    

    

    if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))//開始連接

    {

        printf("connect fail !\r\n");

        return -1;

    }

    printf("connect ok !\r\n");

    ssize_t num=1024;

    if(-1 == (recbytes = read(cfd,buffer,num)))//如果讀取失敗

    {

        printf("read data fail !\r\n");

        return -1;

    }

    printf("read ok\r\nREC:\r\n");

    

    buffer[recbytes]='\0';

    printf("%s\r\n",buffer);

    

    getchar();

    close(cfd);

    return 0;

}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *