最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux下使用使用socket實(shí)現(xiàn)TCP服務(wù)端的示例代碼

 更新時(shí)間:2024年03月18日 09:41:29   作者:Hello阿爾法  
套接字(socket)是 Linux 下的一種進(jìn)程間通信機(jī)制(socket IPC),它不僅支持同一主機(jī)的不同進(jìn)程間通信,還支持跨網(wǎng)絡(luò)的不同主機(jī)的進(jìn)程間通信,本文介紹了 Linux 下使用 socket 接口實(shí)現(xiàn) TCP 服務(wù)端的示例程序,需要的朋友可以參考下

套接字(socket)是 Linux 下的一種進(jìn)程間通信機(jī)制(socket IPC),它不僅支持同一主機(jī)的不同進(jìn)程間通信,還支持跨網(wǎng)絡(luò)的不同主機(jī)的進(jìn)程間通信。

socket 允許通過(guò)標(biāo)準(zhǔn)的文件描述符進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸,支持各種網(wǎng)絡(luò)協(xié)議,如 TCP 和 UDP,它把復(fù)雜的 TCP/IP 協(xié)議隱藏在 socket 接口下,對(duì)用戶(hù)來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓 socket 去組織數(shù)據(jù),以符合指定的協(xié)議。

基于 socket 接口編寫(xiě)的應(yīng)用程序可以移植到任何實(shí)現(xiàn) BSD socket 標(biāo)準(zhǔn)的平臺(tái)。本文介紹了 Linux 下使用 socket 接口實(shí)現(xiàn) TCP 服務(wù)端的示例程序。

  • 開(kāi)發(fā)環(huán)境:虛擬機(jī) Ubuntu 18.04
  • 驗(yàn)證平臺(tái):Elfboard Linux 開(kāi)發(fā)板
  • 客戶(hù)端:Windows 網(wǎng)絡(luò)調(diào)試助手 NetAssist

示例代碼

  • tcp_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <errno.h>
#include "tcp_server.h"

int server_init_socket(void) 
{
    int socket_fd;
    struct sockaddr_in address;

    if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if (bind(socket_fd, (struct sockaddr *)&address, sizeof(address)) < 0) 
    {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    if (listen(socket_fd, 3) < 0) 
    {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    return socket_fd;
}

int server_set_socket_timeout(int socket_fd, long milliseconds)
{
    struct timeval tv;

    tv.tv_sec =  milliseconds / 1000; 
    tv.tv_usec = (milliseconds % 1000) * 1000;

    if (setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv)) < 0) 
    {
        perror("setsockopt SO_RCVTIMEO");
        exit(EXIT_FAILURE);
    }

    return 0;
}

int server_accept_client(int socket_fd) 
{
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    int temp_fd = accept(socket_fd, (struct sockaddr *)&address, 
                                            (socklen_t*)&addrlen);
    if (temp_fd < 0) 
    {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    printf("Connection established with %s:%d\n", 
            inet_ntoa(address.sin_addr), ntohs(address.sin_port));
    return temp_fd;
}

int server_receive_data(int socket_fd, char *message, ssize_t *size) 
{
    ssize_t bytes_received = recv(socket_fd, message, BUFFER_SIZE, 0);
    if (bytes_received == -1) 
    {
	    if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ETIMEDOUT)
        {
            printf("socket recv time out \r\n");
            return 1;
        } 
        else 
        {
            perror("recv");
            exit(EXIT_FAILURE);
        }
    }
    *size = bytes_received;
    return 0;
}

void server_send_data(int socket_fd, const char *message, ssize_t size) 
{
    if (send(socket_fd, message, size, 0) < 0) 
    {
        perror("send");
        exit(EXIT_FAILURE);
    }
}

int server_check_tcp_connection(int socket_fd) 
{
    int error = 0;
    socklen_t len = sizeof(error);
    if (getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0) 
    {
        if (error == 0) 
        {
            return 1;
        }
    }
    return 0;
}

int server_close_socket(int socket_fd) 
{
    close(socket_fd);
    return 0;
}
  • tcp_server.h
#ifndef __TCP_SERVER__
#define __TCP_SERVER__

#include <sys/socket.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int server_init_socket(void);
int server_accept_client(int socket_fd);
int server_set_socket_timeout(int socket_fd, long milliseconds);
int server_receive_data(int socket_fd, char *message, ssize_t *size) ;
void server_send_data(int socket_fd, const char *message, ssize_t size);
int server_check_tcp_connection(int socket_fd);
int server_close_socket(int fd);

#endif
  • main.c
#include <stdio.h>
#include "tcp_server.h"

int main(void)
{
    int server_fd, client_fd;
    char buffer[1024] = {0};
    ssize_t size = 0;

    server_fd = server_init_socket();
    client_fd = server_accept_client(server_fd);
    
    server_send_data(client_fd, "Hello Client!", 13);
    
    server_receive_data(client_fd, buffer, &size);
    printf("%s", buffer);
    
    server_close_socket(client_fd);
    server_close_socket(server_fd);
    
    return 0;
}
  • 通過(guò)交叉編譯生成目標(biāo)程序,拷貝到 Elfboard Linux 開(kāi)發(fā)板上

板級(jí)驗(yàn)證

  • 啟動(dòng) Elfboard Linux 開(kāi)發(fā)板作為服務(wù)端,查看 IP:

  • 打開(kāi)網(wǎng)絡(luò)調(diào)試助手,配置協(xié)議類(lèi)型為 TCP 客戶(hù)端,設(shè)置服務(wù)端 IP、端口號(hào):

  • 運(yùn)行服務(wù)端程序,等待客戶(hù)端連接:

  • 客戶(hù)端點(diǎn)擊連接:

  • 服務(wù)端顯示客戶(hù)端已連接:

  • 客戶(hù)端收到服務(wù)端發(fā)送的消息:

  • 客戶(hù)端回復(fù)服務(wù)端消息:

  • 服務(wù)端接收到客戶(hù)端消息:

以上就是Linux下使用使用socket實(shí)現(xiàn)TCP服務(wù)端的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Linux socket實(shí)現(xiàn)TCP服務(wù)端的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • inotify-tools+rsync實(shí)時(shí)同步文件的配置方法

    inotify-tools+rsync實(shí)時(shí)同步文件的配置方法

    我使用的是google的inotify-tools,比較簡(jiǎn)單.國(guó)內(nèi)有功能很強(qiáng)大的類(lèi)似的程序,但是好復(fù)雜.
    2013-02-02
  • Centos7 mysql數(shù)據(jù)庫(kù)安裝及配置實(shí)現(xiàn)教程

    Centos7 mysql數(shù)據(jù)庫(kù)安裝及配置實(shí)現(xiàn)教程

    這篇文章主要介紹了Centos7 mysql數(shù)據(jù)庫(kù)安裝及配置實(shí)現(xiàn)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Linux虛擬機(jī)重啟找不到IP的解決方案

    Linux虛擬機(jī)重啟找不到IP的解決方案

    這篇文章主要為大家詳細(xì)介紹了Linux虛擬機(jī)重啟找不到IP問(wèn)題的解決方案,文中通過(guò)示例圖片和代碼進(jìn)行了詳細(xì)的講解,有需要的小伙伴可以參考下
    2024-12-12
  • 使用dig/nslookup命令查看dns解析的方法步驟

    使用dig/nslookup命令查看dns解析的方法步驟

    這篇文章主要介紹了使用dig/nslookup命令查看dns解析的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Linux下在線(xiàn)安裝啟動(dòng)VNC教程

    Linux下在線(xiàn)安裝啟動(dòng)VNC教程

    本文指導(dǎo)在CentOS7上在線(xiàn)安裝VNC,包含安裝、配置密碼、啟動(dòng)/停止、清理重啟步驟及注意事項(xiàng),強(qiáng)調(diào)需安裝VNC桌面以避免黑屏,并解決端口沖突和目錄權(quán)限問(wèn)題
    2025-07-07
  • 整理Linux中字符串的相關(guān)操作技巧

    整理Linux中字符串的相關(guān)操作技巧

    我們?cè)趌inux的操作中經(jīng)常會(huì)對(duì)文件中的字符串進(jìn)行替換、統(tǒng)計(jì)等操作,我們現(xiàn)在來(lái)做一次整理,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2018-10-10
  • Centos7下面如何配置靜態(tài)IP

    Centos7下面如何配置靜態(tài)IP

    本篇文章主要介紹了Centos7下面如何配置靜態(tài)IP,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 詳解ubuntu 20.04 LTS安裝記錄

    詳解ubuntu 20.04 LTS安裝記錄

    這篇文章主要介紹了ubuntu 20.04 LTS安裝記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于如何在崩潰或重啟后保持Linux進(jìn)程運(yùn)行的解決方法

    關(guān)于如何在崩潰或重啟后保持Linux進(jìn)程運(yùn)行的解決方法

    在計(jì)算機(jī)系統(tǒng)中,進(jìn)程的穩(wěn)定性和持久性對(duì)于確保系統(tǒng)正常運(yùn)行至關(guān)重要,在 Linux 系統(tǒng)中,由于各種原因,進(jìn)程可能會(huì)面臨崩潰或系統(tǒng)重啟的情況,為了確保關(guān)鍵進(jìn)程的持續(xù)運(yùn)行,我們需要采取一些措施來(lái)處理這種情況,文中給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • centos6.7 安裝python2.7、pip2.7、easy_install-2.7的方法

    centos6.7 安裝python2.7、pip2.7、easy_install-2.7的方法

    這篇文章主要介紹了centos6.7 安裝python2.7、pip2.7、easy_install-2.7的方法,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

达日县| 龙岩市| 江口县| 九龙县| 河曲县| 奉节县| 会宁县| 汉寿县| 威海市| 商南县| 石景山区| 大宁县| 清徐县| 泾阳县| 南丹县| 南木林县| 中卫市| 昌图县| 晴隆县| 平原县| 东辽县| 长岭县| 榕江县| 木里| 青河县| 石屏县| 芮城县| 怀集县| 彭水| 儋州市| 杂多县| 柘荣县| 玛纳斯县| 托克托县| 咸阳市| 安国市| 北辰区| 金山区| 宝应县| 讷河市| 顺义区|