日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux下TCP服務(wù)器搭建(tcpservelinux)

在網(wǎng)絡(luò)編程中,TCP/IP協(xié)議是最常用的一種協(xié)議,因為它可以保證數(shù)據(jù)傳輸?shù)目煽啃院头€(wěn)定性。而在Linux系統(tǒng)中搭建TCP服務(wù)器也是比較常見的操作。本文將介紹Linux下如何搭建TCP服務(wù)器,讓讀者能夠快速上手和使用。

1. 準(zhǔn)備工作

在開始設(shè)置之前,需要先在Linux系統(tǒng)上安裝好gcc編譯器和支持TCP協(xié)議的庫。具體操作如下:

“`bash

$ sudo apt-get update

$ sudo apt-get install build-essential

$ sudo apt-get install libssl-dev

$ sudo apt-get install libevent-dev

“`

2. 確定服務(wù)器IP地址和端口號

在設(shè)置服務(wù)器之前,需要確定服務(wù)器的IP地址和端口號。IP地址可以是本地IP地址127.0.0.1,也可以是公網(wǎng)IP地址。端口號可以自行選擇,一般默認(rèn)端口號為8000。假設(shè)本文中采用本地IP地址和默認(rèn)端口號8000。

3. 編寫服務(wù)器端代碼

接下來需要編寫服務(wù)器端代碼。服務(wù)器端的主要任務(wù)是監(jiān)聽客戶端的連接請求,并接受、處理、返回客戶端的數(shù)據(jù)。代碼如下:

“`c

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE 1024

int mn()

{

// 創(chuàng)建套接字

int listen_fd = socket(AF_INET, SOCK_STREAM, 0);

// 綁定IP地址和端口號

struct sockaddr_in addr;

memset(&addr, 0, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = htonl(INADDR_ANY);

addr.sin_port = htons(8000);

bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr));

// 監(jiān)聽連接

listen(listen_fd, 10);

// 無限循環(huán),等待客戶端連接并處理請求

while(1) {

// 接受客戶端連接請求

struct sockaddr_in client_addr;

socklen_t client_len = sizeof(client_addr);

int client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len);

printf(“Client %s:%d connected.\n”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

// 接受客戶端數(shù)據(jù)

char buffer[BUFFER_SIZE];

memset(buffer, 0, BUFFER_SIZE);

int len = recv(client_fd, buffer, BUFFER_SIZE, 0);

printf(“Received from client %s:%d message: %s.\n”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);

// 處理客戶端數(shù)據(jù)

char response[] = “Hello, client!”;

send(client_fd, response, strlen(response), 0);

// 關(guān)閉客戶端連接

close(client_fd);

printf(“Client %s:%d disconnected.\n”, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

}

// 關(guān)閉套接字

close(listen_fd);

return 0;

}

“`

服務(wù)器端代碼主要分為以下幾個步驟:

– 創(chuàng)建套接字:使用socket()函數(shù)創(chuàng)建套接字,并指定協(xié)議類型為TCP。

– 綁定IP地址和端口號:使用bind()函數(shù)綁定服務(wù)器的IP地址和端口號,使服務(wù)器能夠接受來自客戶端的連接請求。

– 監(jiān)聽連接:使用listen()函數(shù)監(jiān)聽接收來自客戶端的連接請求。

– 無限循環(huán),等待客戶端的連接請求并處理請求:使用accept()函數(shù)接受客戶端的連接請求,并接受、處理、返回客戶端的數(shù)據(jù),最后關(guān)閉客戶端連接。

4. 編譯服務(wù)器端代碼

完成服務(wù)器端代碼的編寫后,需要使用gcc編譯器進行編譯。命令如下:

“`bash

$ gcc -o server server.c -levent -lpthread

“`

其中,-levent和-lpthread都是編譯選項,levent是事件庫,pthread是線程庫。

5. 運行服務(wù)器端代碼

完成編譯后,需要在Linux系統(tǒng)上運行服務(wù)器端代碼。命令如下:

“`bash

$ ./server

“`

此時服務(wù)器端已經(jīng)啟動,可以接收來自客戶端的連接請求并處理請求。但由于沒有編寫客戶端代碼,可以使用Linux系統(tǒng)自帶的telnet命令來模擬客戶端連接,命令如下:

“`bash

$ telnet 127.0.0.1 8000

“`

連接成功后可以發(fā)送任意消息,服務(wù)器端將返回“Hello, client!”。

6.

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220

server端在linux上,client端在winCE上,通過tcp socket傳輸byte{]

linux sockets和winsock是可以互滑桐相脊余傳遞櫻讓滾信息的,不同的操作系統(tǒng)都得遵循TCP/IP協(xié)議。

我剛備襪剛給其他的朋友寫的socket程序發(fā)給你

服務(wù)器:

include

#include 隱滾鉛

#include

#include

#include

#include

#include

#define LINE 2023

pthread_mutex_t work = PTHREAD_MUTEX_INITIALIZER;

struct sockaddr_in tcpsock, udpsock;

void *handle_tcp(void *arg)

{

int tcpfd = *((int *)arg);

int tcpcon;

int n;

char *suc = “success”;

socklen_t len = 0;

struct sockaddr_in tcpcli;

listen(tcpfd, 20);

char str;

char buf;

while(1)

{

len = sizeof(tcpcli);

tcpcon = accept(tcpfd, (struct sockaddr*)&tcpcli, &len);

pthread_mutex_lock(&work);

printf(“receive from %s at port %d\n”,

inet_ntop(PF_INET, &tcpcli.sin_addr, str, sizeof(str)),

ntohs(tcpcli.sin_port));

pthread_mutex_unlock(&work);

while(1)

{

if((n = read(tcpcon, buf, LINE)) == 0)

{

close(tcpcon);

break;

}

else

{

pthread_mutex_lock(&work);

printf(“\n”, buf);

pthread_mutex_unlock(&work);

write(tcpcon, suc, 8);

}

}

}

}

void *handle_udp(void *arg)

{

int udpfd = *((int *)arg);

socklen_t len;

struct sockaddr_in udpcli;

int n;

char buf;

char *suc = “success”;

while(1)

{

len = sizeof(udpcli);

if((n = recvfrom(udpfd, buf, LINE, 0, (struct sockaddr*)&udpcli, &len)) == -1)

{

pthread_mutex_lock(&work);

fprintf(stderr, “recvfrom error\n”);

pthread_mutex_unlock(&work);

}

else

{

printf(“\n”, atoi(buf));

}

if((n = sendto(udpfd, suc, 8, 0, (struct sockaddr*)&udpcli, sizeof(udpcli))) == -1)

{

pthread_mutex_lock(&work);

fprintf(stderr, “sendto error\n”);

pthread_mutex_unlock(&work);

}

}

}

int main(void)

{

int udpfd, tcpfd;

tcpfd = socket(PF_INET, SOCK_STREAM, 0);

udpfd = socket(PF_INET, SOCK_DGRAM, 0);

pthread_t tcP, udP;

int ret;

bzero(&tcpsock, sizeof(tcpsock));

bzero(&udpsock, sizeof(udpsock));

tcpsock.sin_port = htons(8000);

tcpsock.sin_family = PF_INET;

tcpsock.sin_addr.s_addr = htonl(INADDR_ANY);

udpsock.sin_family = PF_INET;

udpsock.sin_port = htons(8000);

udpsock.sin_addr.s_addr = htonl(INADDR_ANY);

bind(tcpfd, (struct sockaddr*)&tcpsock, sizeof(tcpsock));

bind(udpfd, (struct sockaddr*)&udpsock, sizeof(udpsock));

printf(“waitting message………………….\n”);

if((ret = pthread_create(&tcP, NULL, handle_tcp, (void*)&tcpfd)) != 0)

{

fprintf(stderr, “can’t create tcp thread:%s\n”, strerror(ret));

exit(1);

}

if((ret = pthread_create(&udP, NULL, handle_udp, (void*)&udpfd)) != 0)

{

fprintf(stderr, “can’t create udp thread:%s\n”, strerror(ret));

exit(1);

}

while(1);

return 0;

}

---------------------------

客戶端:

#include

#include

#include

#include

#include

#include

#define LINE 2023

int main(void)

{

struct sockaddr_in tcpsock, udpsock;

int tcpfd, udpfd;

char buf;

int n;

tcpfd = socket(PF_INET, SOCK_STREAM, 0);

udpfd = socket(PF_INET, SOCK_DGRAM, 0);

bzero(&tcpsock, sizeof(tcpsock));

bzero(&udpsock, sizeof(udpsock));

tcpsock.sin_port = htons(8000);

tcpsock.sin_family = PF_INET;

inet_pton(PF_INET, “127.0.0.1”, &tcpsock.sin_addr);

udpsock.sin_port = htons(8000);

udpsock.sin_family = PF_INET;

inet_pton(PF_INET, “127.0.0.1”, &udpsock.sin_addr);

bind(tcpfd, (struct sockaddr*)&tcpsock, sizeof(tcpsock));

bind(udpfd, (struct sockaddr*)&udpsock, sizeof(udpsock));

connect(tcpfd, (struct sockaddr*)&tcpsock, sizeof(tcpsock));

while(1)

{

n = read(0, buf, LINE);

buf = 0;

write(tcpfd, buf, n-1);

read(tcpfd, buf, LINE);

printf(“\n”, buf);

sprintf(buf, “%d”, n);

sendto(udpfd, buf, strlen(buf), 0, (struct sockaddr*)&udpsock, sizeof(udpsock));

recvfrom(udpfd, buf, LINE, 0, NULL, 0);

printf(“\n”, buf);

bzero(buf, LINE);

}

return 0;

}

檢查tcp 有沒有斷開 linux

client/server端recv:讓前

①對端close(fd)檢測(超時檢測):recv 返回0,說明配譽緩存區(qū)數(shù)據(jù)被讀完,實測兩種情況,對端沒有再發(fā)數(shù)據(jù),對端fd被關(guān)閉了。

通過select超時來檢測,當(dāng)超時如2s,我們認(rèn)為對端連接斷開,應(yīng)關(guān)閉本地的fd。

②網(wǎng)線斷開/斷電關(guān)機檢測(超時檢測):recv 返回-1,errno == EAGAIN,意為“沒有可讀寫數(shù)據(jù),緩沖區(qū)無數(shù)據(jù)”。

所以此時需要培滑段select超時檢測,若超時,要么對端沒有再發(fā)數(shù)據(jù),要么對端的網(wǎng)線斷了或者直接斷電了。

超過我們判定為對端不在線,關(guān)閉本地的fd。

關(guān)于tcp serve linux的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。


分享文章:Linux下TCP服務(wù)器搭建(tcpservelinux)
文章URL:http://www.5511xx.com/article/cogoegs.html