1. 程式人生 > >client和server簡單基礎版之建立套接字完成通訊

client和server簡單基礎版之建立套接字完成通訊

TCP建立套接字連結通訊,知識點學習如下連結:https://www.cnblogs.com/zhanggaofeng/p/5869053.html

  1. 客戶端程式碼
    #include<sys/socket.h>
    #include<arpa/inet.h>
    #include<stdio.h>
    #include<string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <errno.h>
    
    int main(int argc,char *argv[])
    {
       //宣告套接字和套接字地址結構
       int sockfd; 
       struct sockaddr_in addr;
      if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){
        printf("socket error!");
       }
       bzero(&addr, sizeof(addr));
       addr.sin_family=AF_INET;
       addr.sin_port=htons(8080);
       addr.sin_addr.s_addr=inet_addr("127.0.0.1");
       if(connect(sockfd, (struct sockaddr*)&addr, sizeof(addr))==-1)
       {
         printf("connect failed ! error message :%s\n",strerror(errno));
       } 
       else printf("success");
       close(sockfd);
       return 0;
    }

    2

  2. 伺服器端程式碼

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <errno.h>
    #include <arpa/inet.h>
    #define PORT 8080   //埠號
    #define BACKLOG 10   //所允許的連線數量
    using namespace std;
    int main()
    {
        int socketfd,connectfd;  //描述符
        struct sockaddr_in server;  //伺服器地址
        struct sockaddr_in client;  //客戶地址
        socketfd=socket(AF_INET, SOCK_STREAM, 0);
        if(socketfd==-1)
        {
            printf("socket  failed\n");
            close(socketfd);
            return 0;
        }
        bzero(&server, sizeof(server)); //初始化
        server.sin_family=AF_INET;      //tcp套接字
        server.sin_port=htons(PORT);    //將埠轉換為網路字序
        server.sin_addr.s_addr=htonl(INADDR_ANY);   //核心選擇ip
        if(bind(socketfd, (struct sockaddr *)&server,sizeof(server))==-1)  //將套接字繫結到指定的協議地址
        {
    
            printf("Bind error\n");
            close(socketfd);
            return 0;
    
        }
        if(listen(socketfd, BACKLOG)==-1)  //監聽 (如果沒有請求,則被阻塞,進入休眠狀態)
        {
            printf("listen error\n");
            close(socketfd);
            return 0;
        }
        socklen_t sin_size=sizeof(struct sockaddr_in);
        if ((connectfd=accept(socketfd, (struct sockaddr *)&client,&sin_size))==-1)  //接收請求
        {
    
            printf("connect failed ! error message :%s\n",strerror(errno));
            close(socketfd);
            return 0;
    
        }
        printf("you got a connection form %s\n",inet_ntoa(client.sin_addr));
        send(connectfd, "hello\n", 10, 0); //傳送資訊
        close(connectfd);
        close(socketfd);
    
        return 0;
    
    }
    
    

    在程式測試中曾遇到“connect failed ! error message :Socket operation on non-socket”錯誤,經百度除錯發現是由於在客戶端建立socket時“   if(listenfd= socket(AF_INET,SOCK_STREAM, 0)==-1)   ”少寫了一個括號。加上程式就執行正確了。第一篇部落格,加油!