Linux下套接字編程簡例

下面設計一個簡單的CS例子:服務端監聽某個端口,接受一個連接,接收該連接傳來的數據並顯示;客戶端連接服務端,把標準輸入的信息發給服務端。

服務端代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    // 創建TCP套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock)
    {
        perror("socket");
        return -1;
    }

    // 填充地址結構體:監聽8888端口
    struct sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;  // 任意接口地址
    addr.sin_port = htons(8888);        // 8888端口,htons從主機序到網絡序

    // 綁定地址
    int ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    if (-1 == ret)
    {
        perror("bind");
        return -1;
    }

    // 開始監聽
    ret = listen(sock, 10);
    if (-1 == ret)
    {
        perror("listen");
        return -1;
    }

    // 接受新連接
    int len = sizeof(addr);
    int conn = accept(sock, (struct sockaddr *)&addr, &len);
    if (-1 == conn)
    {
        perror("accept");
        return -1;
    }

    // 新連接対端信息
    printf("accept %s:%d\n\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

    while (1)
    {
        // 接收信息
        char buffer[1024];
        len = recv(conn, buffer, sizeof(buffer)-1, 0);
        if (-1 == len)
        {
            perror("recv");
            return -1;
        }
        else if (0 == len)  // 連接斷開
        {
            break;
        }

        buffer[len] = '\0';
        printf("%s", buffer);
    }

    return 0;
}

客戶端代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char *argv[])
{
    // 創建TCP套接字
    int conn = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == conn)
    {
        perror("socket");
        return -1;
    }

    // 填充地址結構體:連接本機的8888端口
    struct sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(8888);

    // 連接到服務端:本機的8888端口
    int ret = connect(conn, (struct sockaddr *)&addr, sizeof(addr));
    if (-1 == ret)
    {
        perror("connect");
        return -1;
    }

    while (1)
    {
        // 從標準輸入讀入
        char buffer[1024];
        int len = read(0, buffer, sizeof(buffer));
        if (-1 == len)
        {
            perror("read");
            return -1;
        }
        else if (0 == len)
        {
            break;  // 輸入結束
        }

        // 將輸入信息發給服務端
        len = send(conn, buffer, len, 0);
        if (-1 == len)
        {
            perror("send");
            return -1;
        }
    }

    return 0;
}

當然了,這兩個程序還是相當醜陋的,網絡編程要注意很多細節。儘管如此,對於網絡編程初學者弄懂socket編程流程還是有幫助的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章