C++ socket初探 實現局域網聊天功能

本文講述socket客戶端和服務端的簡單實現。

客戶端

  1. 用到的頭文件及用法
<code>#include 
/*獲取設置socket,bind*/

#include
/*基本數據類型,如time_t*/
#include
/*用於socketaddr_in結構體,htons系統調用*/
#include
/*對read write提供支持*/
#include
/*提供 inet_addr*/
#include
#include
/<code>
  1. 程序原理
  • 先聲明一個存放端口和協議類型的結構體對象。sockret=socket(AF_INET,SOCK_STREAM,0);
  • 設置好連接的方式
<code>sock.sin_family = AF_INET;
sock.sin_addr.s_addr = inet_addr("127.0.0.1");
sock.sin_port = htons(4000);//40975
len=sizeof(sock);
result=connect(sockret,(struct sockaddr*)&sock,len);
/<code>
  • 向服務端收發數據
<code>write(sockret,&ch,1);
read(sockret,&ch,1);
/<code>

3.源代碼如下

<code>#include 
/*獲取設置socket,bind*/
#include
/*基本數據類型,如time_t*/
#include
/*用於socketaddr_in結構體,htons系統調用*/
#include
/*對read write提供支持*/
#include
/*提供 inet_addr*/
#include

#include
using namespace std;

int main()
{
    int sockret;
    int len;
    struct sockaddr_in sock;
    int result;
    char ch='J';
    /*AF_INET是ipv4,sock流是tcp協議*/
    sockret=socket(AF_INET,SOCK_STREAM,0);
    /*連接方式,IP ,端口,端口用大小端轉換*/
    sock.sin_family = AF_INET;
    sock.sin_addr.s_addr = inet_addr("127.0.0.1");
    sock.sin_port = htons(4000);//40975
    len=sizeof(sock);
    result=connect(sockret,(struct sockaddr*)&sock,len);
    if(result!=0)
    {
        perror("clinent error");
    }
    write(sockret,&ch,1);
    read(sockret,&ch,1);
    cout

服務端

主要負責監聽端口,並且響應連接請求。

<code>#include
#include
#include
#include
#include
#include
#include
#include

#define MAXLINE 4096

int main(){
    int  listenfd, connfd;
    struct sockaddr_in  servaddr;
    char  buff[4096];
    int  n;

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(4000);

    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }

    if( listen(listenfd, 10) == -1){
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }

    printf("======waiting for client's request======\n");
    while(1){
        if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
            printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
            continue;
        }
        n = recv(connfd, buff, MAXLINE, 0);
        buff[n] = '\0';
        printf("recv msg from client: %s\n", buff);
        close(connfd);
    }
    close(listenfd);
    return 0;
}

/<code>

總結

有後續的內容,以後再補充吧


分享到:


相關文章: